একাধিক কোর কীভাবে ব্যবহার করবেন সে সম্পর্কে ইতিমধ্যে আপনার কাছে একটি উত্তর পেয়েছে, তবে আসল সমস্যাটি আপনি নিজের লুপগুলি লিখেছেন with লুপের প্রতিটি পুনরাবৃত্তিতে কখনই আপনার ফলাফল ভেক্টর / অবজেক্টটি প্রসারিত করবেন না । আপনি যদি এটি করেন, আপনি আর কে আপনার ফলাফল ভেক্টর / অবজেক্টটি অনুলিপি করতে বাধ্য করেন এবং এটি সমস্ত সময় লাগে বলে প্রসারিত করে। পরিবর্তে, লুপটি শুরু করার আগে পর্যাপ্ত স্টোরেজ স্পেসটি বানাবেন এবং আপনি পাশাপাশি যাবেন। এখানে একটি উদাহরণ:
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() আপনার ম্যাট্রিক্সের গতি পরীক্ষার জন্য বা অন্য মাল্টি-কোর বিকল্পগুলির পেতাম কারণ তাদের ওভারহেড সেট আপ করার ক্ষেত্রে ন্যায্যতা প্রমাণ করতে তাদের জিনিসগুলি যথেষ্ট গতিতে হবে would পৃথক পৃথক প্রসেসগুলি যা বিভিন্ন সিপিইউ কোরগুলি তৈরি করে।
আপডেট: @ শ্যাববিচেফের মন্তব্য অনুসরণ করে একবারের অঙ্কগুলি করা এবং গড়ের গণনায় পুনরায় ব্যবহার করা কি দ্রুত?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
এই পরীক্ষার দৌড়ে নয়, তবে এটি পরিসীমা থেকে দূরে ...