我知道我不应该嵌套并行运算符,但是我必须在代码中基本上嵌套两个mclapply()
调用。
这是因为在我的代码中,我有一个函数(我们称其为foo()
)已经在其中使用了mclapply()
。我想要的基本上是运行foo()
的顺序版本的并行线程,做这样的事情:
mclapply(X, function(x) {
foo(x, mc.cores = 1)
},
mc.cores = 4)
我可以仅使用mclapply()
运行内部mc.cores = 1
还是应该实现foo()
的顺序版本?
换句话说:mclapply(..., mc.cores = 1)
的行为与lapply(...)
完全一样吗?在这种情况下,是否存在并行开销使程序变慢?
答案 0 :(得分:7)
parallel::mclapply
的源代码包含以下代码:
...
if (cores < 2L)
return(lapply(X = X, FUN = FUN, ...))
...
因此,我相信答案是肯定的,您应该获得与直接使用lapply
相同的结果,但是还会有一些额外的开销。我怀疑这会严重影响运行时间。
文档还指出:
详细信息
mclapply是lapply的并行版本,只要mc.cores> 1: 对于mc.cores == 1,它只是调用lapply。