【发布时间】:2012-05-02 10:25:36
【问题描述】:
我第一次在 R 中使用并行化。作为第一个玩具示例,我尝试了
library(doMC)
registerDoMC()
B<-10000
myFunc<-function()
{
for(i in 1:B) sqrt(i)
}
myFunc2<-function()
{
foreach(i = 1:B) %do% sqrt(i)
}
myParFunc<-function()
{
foreach(i = 1:B) %dopar% sqrt(i)
}
我知道sqrt() 执行速度太快以至于并行化无关紧要,但我没想到的是foreach() %do% 会比for() 慢:
> system.time(myFunc())
user system elapsed
0.004 0.000 0.005
> system.time(myFunc2())
user system elapsed
6.756 0.000 6.759
> system.time(myParFunc())
user system elapsed
6.140 0.524 6.096
在我见过的大多数示例中,foreach() %dopar% 与foreach() %do% 进行比较,而不是for()。由于在我的玩具示例中 foreach() %do% 比 for() 慢得多,所以我现在有点困惑。不知何故,我认为这些是构造 for 循环的等效方法。有什么不同?他们曾经是等价的吗? foreach() %do% 总是慢吗?
更新:按照@Peter Fines 的回答,我更新myFunc 如下:
a<-rep(NA,B)
myFunc<-function()
{
for(i in 1:B) a[i]<-sqrt(i)
}
这让for() 慢了一点,但并不多:
> system.time(myFunc())
user system elapsed
0.036 0.000 0.035
> system.time(myFunc2())
user system elapsed
6.380 0.000 6.385
【问题讨论】:
-
感谢@Charlie,这些问题的答案对我完成玩具示例后的尝试非常有帮助! :) 我仍然不确定我是否理解为什么
foreach在使用%do%选项时需要更多时间。 -
其中很大一部分是 %do% 必须将碎片/作业打包,将它们发送给处理器,然后在最后适当地重新加入所有内容。这些步骤需要组织时间,而无与伦比的版本不需要。
-
%dopar%不就是这样做的吗? -
有趣! 我得到了完全相反的结果!见Why is R for loop 10 times slower than when using foreach?
标签: r parallel-processing