R में लूप्स उसी कारण से धीमे होते हैं जिस कारण किसी भी व्याख्या की गई भाषा धीमी होती है: प्रत्येक ऑपरेशन में बहुत सारे अतिरिक्त सामान होते हैं।
पर देखो R_execClosure
मेंeval.c
(इस समारोह उपयोगकर्ता परिभाषित समारोह कॉल करने के लिए कहा जाता है)। यह लगभग 100 लाइनें लंबी है और सभी प्रकार के संचालन करती है - निष्पादन के लिए एक वातावरण बनाना, पर्यावरण में तर्क देना, आदि।
सोचें कि जब आप C में किसी फंक्शन को बुलाते हैं तो कितना कम होता है (पुश स्टैग्स ऑन स्टैक, जंप, पॉप आर्ग्स)।
इसीलिए आपको इस तरह की टाइमिंग मिलती है (जैसा कि ज़ोरान ने टिप्पणी में बताया है, यह वास्तव में apply
ऐसा नहीं है, यह तेजी से हो रहा है; यह आंतरिक C लूप है mean
जो तेजी से हो रहा है। apply
यह नियमित रूप से पुराना R कोड है)।
A = matrix(as.numeric(1:100000))
एक लूप का उपयोग करना: 0.342 सेकंड:
system.time({
Sum = 0
for (i in seq_along(A)) {
Sum = Sum + A[[i]]
}
Sum
})
राशि का उपयोग:
sum(A)
यह थोड़ा विवादास्पद है क्योंकि, asymptotically, लूप उतना ही अच्छा है sum
; इसका कोई व्यावहारिक कारण नहीं है कि यह धीमा होना चाहिए; यह सिर्फ प्रत्येक पुनरावृत्ति के लिए अतिरिक्त काम कर रहा है।
तो विचार करें:
system.time({
I = 0
while (I < 100000) {
10
I = I + 1
}
})
system.time({
I = 0
while (I < 100000) {
((((((((((10))))))))))
I = I + 1
}
})
(वह उदाहरण रेडफोर्ड नील द्वारा खोजा गया था )
क्योंकि (
R में एक ऑपरेटर है, और वास्तव में आपको इसके उपयोग के लिए हर बार नाम खोज की आवश्यकता होती है:
> `(` = function(x) 2
> (3)
[1] 2
या, सामान्य रूप से, व्याख्या किए गए संचालन (किसी भी भाषा में) के अधिक चरण हैं। बेशक, उन कदमों के साथ-साथ लाभ प्रदान करते हैं: क्या आप नहीं कर सका करना है कि (
सी में चाल
system.time
जवाब में युद्ध शुरू ...