我知道我不应该嵌套并行运算符,但我的情况是我必须在代码中嵌套两个mclapply()
调用。 这是因为在我的代码中,我有一个函数(我们称之为foo()
(,它已经在里面使用了mclapply()
。我想要的基本上是运行foo()
顺序版本的并行线程,做这样的事情:
mclapply(X, function(x) {
foo(x, mc.cores = 1)
},
mc.cores = 4)
我可以只使用mc.cores = 1
运行内部mclapply()
还是应该实现foo()
的顺序版本?
换句话说:mclapply(..., mc.cores = 1)
的行为是否完全像lapply(...)
?在这种情况下,是否有并行开销减慢程序的速度?
parallel::mclapply
的源代码包含以下代码:
...
if (cores < 2L)
return(lapply(X = X, FUN = FUN, ...))
...
所以我相信答案是肯定的,你应该得到与直接使用lapply
相同的结果,但也有一些额外的开销。我怀疑这会对运行时产生非常显着的影响。
该文件还指出:
详
McLapply是lapply的并行化版本,前提是mc.cores> 1: 对于 mc.cores == 1,它只是调用 lapply。