आपको पहले से ही एक उत्तर मिल गया है कि एक से अधिक कोर का उपयोग कैसे किया जाए, लेकिन असली समस्या यह है कि आपने अपने छोरों को किस तरह लिखा है। लूप के प्रत्येक पुनरावृत्ति पर अपने परिणाम वेक्टर / ऑब्जेक्ट का विस्तार कभी न करें । यदि आप ऐसा करते हैं, तो आप अपने परिणाम वेक्टर / ऑब्जेक्ट को कॉपी करने के लिए R को बाध्य करते हैं और इसे बढ़ाते हैं, जिसमें सभी को समय लगता है। इसके बजाय, लूप शुरू करने से पहले पर्याप्त स्टोरेज स्पेस का प्रचार करें और जैसे ही आप साथ जाएं, उसे भरें। यहाँ एक उदाहरण है:
set.seed(1)
p1 <- matrix(rnorm(10000), ncol=100)
system.time({
p1max <- p1mean <- p1sum <- numeric(length = 100)
for(i in seq_along(p1max)){
p1max[i] <- max(p1[i,])
p1mean[i] <- mean(p1[i,])
p1sum[i ]<- sum(p1[i,])
}
})
user system elapsed
0.005 0.000 0.005
या आप इन चीज़ों के माध्यम से कर सकते हैं apply():
system.time({
p1max2 <- apply(p1, 1, max)
p1mean2 <- apply(p1, 1, mean)
p1sum2 <- apply(p1, 1, sum)
})
user system elapsed
0.007 0.000 0.006
लेकिन ध्यान दें कि यह है नहीं है लूप को ठीक से करने और कभी-कभी धीमी गति से करने से तेज ।
हालाँकि, हमेशा वेक्टर कोड की तलाश में रहते हैं। आप पंक्ति रकम और साधनों का उपयोग कर सकते हैं rowSums()और rowMeans()जो लूप या applyसंस्करणों की तुलना में तेज़ हैं :
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
यदि मैं एक सट्टेबाजी का आदमी था, तो मेरे पास धड़कन का उल्लेख करने वाले तीसरे दृष्टिकोण पर पैसा होगा foreach() आपके मैट्रिक्स पर गति परीक्षण में या अन्य मल्टी-कोर विकल्पों का क्योंकि उन्हें स्थापित करने में ओवरहेड को सही ठहराने के लिए चीजों को तेजी से बढ़ाना होगा। अलग-अलग प्रक्रियाओं को अलग सीपीयू कोर से अलग किया जाता है।
अद्यतन: @shabbychef की टिप्पणी के बाद, क्या यह एक बार रकम करने और मतलब की गणना में पुन: उपयोग करने के लिए तेज़ है?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
इस टेस्ट रन में नहीं, लेकिन यह बहुत दूर है ...