आर में छोरों के लिए बेहद धीमी गति से कर रहे हैं, लेकिन यहाँ एक और मुद्दा है। परिणाम वेक्टर, res को प्रीलोकेट करना बहुत तेज है, बल्कि प्रत्येक पुनरावृत्ति पर res को जोड़ने के लिए।
नीचे हम उपरोक्त संस्करण की गति को एक ऐसे संस्करण के साथ तुलना कर सकते हैं जो बस एक वेक्टर, res, लंबाई एन के साथ शुरू होता है और लूप के दौरान ith तत्व को बदलता है।
fn1 <- function(N) {
res <- c()
for (i in 1:N) {
x <- rnorm(2)
res <- c(res,x[2]-x[1])
}
res
}
fn2 <- function(N) {
res <- rep(0,N)
for (i in 1:N) {
x <- rnorm(2)
res[i] <- x[2]-x[1]
}
res
}
> N <- 50000
> system.time(res1 <- fn1(N))
user system elapsed
6.568 0.256 6.826
> system.time(res2 <- fn2(N))
user system elapsed
0.452 0.004 0.496
इसके अलावा, Sharpie points out के रूप में, हम इस थोड़ा तेज apply
(या उसके रिश्तेदारों, sapply
और lapply
) की तरह आर कार्यों का उपयोग करके कर सकते हैं।
fn3 <- function(N) {
sapply(1:N, function(i){ x <- rnorm(2); return(x[2] - x[1]) })
}
> system.time(res3 <- fn3(N))
user system elapsed
0.397 0.004 0.397
स्रोत
2009-07-23 04:19:53
उस आर सूची धागे में दूसरे उत्तर में क्या गलत है: res <- rnorm (10^6) -रनोर्म (10^6)? – ars
@ars: आप बिल्कुल सही हैं - यह सबसे तेज़ समाधान देता है (परिमाण के क्रम से)। सबसे अच्छी सलाह होगी 1. उन कार्यों का उपयोग करें जो स्वाभाविक रूप से वैक्टरों पर काम करते हैं (जैसे आरएनओआर करता है); 2. उसमें विफल होने पर, * लागू फ़ंक्शन का उपयोग करें; 3. उसमें विफल होना, प्रीलोकेशन के साथ लूप के लिए उपयोग करें। –