मैं आर (क्रांति एनालिटिक्स आर) के लिए नया हूँ और आरआर इस यादृच्छिक क्रमपरिवर्तन समारोह पर धीमा क्यों है?
मेंप्रश्न कुछ मैटलैब कार्यों का अनुवाद किया गया है: क्यों समारोह GRPdur (एन) इतनी धीमी गति से है?
> system.time(GRPdur(10^6))
user system elapsed
15.30 0.00 15.32
> system.time(sample(10^6))
user system elapsed
0.03 0.00 0.03
यहाँ है कि मैं क्या मैटलैब 2011b
>> tic;p = GRPdur(10^6);disp(toc)
0.1364
tic;p = randperm(10^6);disp(toc)
0.1116
में मिलता है:
GRPdur = function(n){
#
# Durstenfeld's Permute algorithm, CACM 1964
# generates a random permutation of {1,2,...n}
#
p=1:n # start with identity p
for (k in seq(n,2,-1)){
r = 1+floor(runif(1)*k); # random integer between 1 and k
tmp = p[k];
p[k] = p[r]; # Swap(p(r),p(k)).
p[r] = tmp;
}
return(p)
}
यहाँ मैं एक Dell प्रेसिजन 690 पर क्या मिलेगा, 2xQuadcore जिऑन 5345 @ 2.33 गीगा, विंडोज 7 64 बिट है
यहाँ है कि मैं क्या मैटलैब 2008a में मिलता है
>> tic;p=GRPdur(10^6);toc
Elapsed time is 0.124169 seconds.
>> tic;p=randperm(10^6);toc
Elapsed time is 0.211372 seconds.
>>
लिंक: GRPdur RPGlab का हिस्सा है, कि मुझे लगता है कि लिखा Matlab कार्यों का एक पैकेज उत्पन्न करता है और परीक्षण विभिन्न यादृच्छिक क्रमपरिवर्तन जेनरेटर। नोट्स को यहां अलग से देखा जा सकता है: Notes on RPGlab।
मूल Durstenfeld अल्गोल कार्यक्रम here
बस उत्सुक: क्या आपने मैटलैब में फॉर-लूप कोड की कोशिश की है? –
क्योंकि हर बार जब आप किसी ऑब्जेक्ट को आर में संशोधित करते हैं, तो एक प्रतिलिपि बनाई जाती है। – hadley
मैं आर संस्करण के समय को 10 या उससे अधिक के कारक से कम कर सकता हूं ताकि लूप के बाहर 'r' के निर्माण को सही ढंग से सदिश बना दिया जा सके और उसके बाद आर के बाइट कंपाइलर का उपयोग किया जा सके (Matlab डिफ़ॉल्ट रूप से जेआईटी संकलन करता है?)। – joran