सामान्य में, इस तरह की समस्याओं के लिए, आप एक-से-एक सी में ++ Rcpp पैकेज का उपयोग कर अपने समारोह अनुवाद कर सकते हैं। यह एक काफी गति देना चाहिए।
पहले, आर संस्करण:
random_sum <- function(loop = 1000) {
x<-c(0,0)
z<-0
for(i in 2:loop) {
x[1]<-x[2]
x[2]<-x[1]+rnorm(1, 0, 1)
if (x[2]<0) {z<-z+1}
}
z/loop
}
set.seed(123)
random_sum()
# [1] 0.134
अब सी ++ संस्करण:
library("Rcpp")
cppFunction("
double random_sum_cpp(unsigned long loop = 1000) {
double x1 = 0;
double x2 = 0;
double z = 0;
for (unsigned long i = 2; i < loop; i++) {
x1 = x2;
x2 = x1 + Rcpp::rnorm(1)[0];
if (x2 < 0) z = z+1;
}
return z/loop;
}")
set.seed(123)
random_sum_cpp()
# [1] 0.134
पूर्णता के लिए, हम भी vectorized संस्करण है कि प्रस्तावित किया गया था पर विचार करते हैं:
random_sum_vector <- function(loop = 1000) {
Y = rnorm(loop)
sum(cumsum(Y)<0)/loop
}
set.seed(123)
random_sum_vector()
# [1] 0.134
हम देखें कि यह एक ही यादृच्छिक बीज के लिए एक ही परिणाम देता है, इसलिए यह एक व्यवहार्य दावेदार लगता है।
बेंचमार्क में, सी ++ संस्करण और vectorized संस्करण सी पर एक मामूली बढ़त प्रदर्शित vectorized संस्करण के साथ, इसी तरह प्रदर्शन ++ संस्करण:
> microbenchmark(random_sum(100000),
random_sum_vector(100000),
random_sum_cpp(100000))
Unit: milliseconds
expr min lq mean median uq max neval
random_sum(1e+05) 184.205588 199.859266 209.220232 205.137043 211.026740 274.47615 100
random_sum_vector(1e+05) 6.320690 6.631704 7.273645 6.799093 7.334733 18.48649 100
random_sum_cpp(1e+05) 8.950091 9.362303 10.663295 9.956996 11.079513 21.30898 100
हालांकि, vectorized संस्करण स्मृति और will blow up your memory for long loops. साथ गति बंद कारोबार सी ++ संस्करण वर्चुअल रूप से कोई स्मृति का उपयोग नहीं करता है।
10^9 चरणों के लिए, सी ++ संस्करण मेरी मशीन पर लगभग 2 मिनट (110 सेकंड) में चलता है। मैंने आर संस्करण की कोशिश नहीं की। छोटे बेंचमार्क के आधार पर, शायद इसमें लगभग 7 घंटे लगेंगे।
> microbenchmark(random_sum_cpp(10^9), times = 1)
Unit: seconds
expr min lq mean median uq max neval
random_sum_cpp(10^9) 110.2182 110.2182 110.2182 110.2182 110.2182 110.2182 1
मैं उलझन में हूं कि आपका लूप 1: 2: लूप के बजाय 2 (2: लूप) पर क्यों शुरू होता है। क्या यह प्रक्रिया केवल 10^9 -1 बार निष्पादित नहीं करता है? – Uwe
@wojciesz: अगर आपको लगता है कि उसने आपके प्रश्न को संबोधित किया है तो एक उत्तर स्वीकार करने के लिए यह परंपरागत है (मतदान बटन के नीचे चेकमार्क पर क्लिक करें)। यहां से चुनने के लिए आपके पास पांच जवाब हैं। अगर आपको लगता है कि किसी ने आपके प्रश्न को संबोधित नहीं किया है तो कृपया टिप्पणी करें कि टिप्पणियों में या आपके प्रश्न के अपडेट में क्यों। –