mc.cores = 1 的 mclapply() 与 lapply() 相同吗?

Is mclapply() with mc.cores = 1 the same as lapply()?

我知道我不应该嵌套并行运算符,但我现在的情况是我基本上必须在我的代码中嵌套两个 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(...) 完全一样吗?在这种情况下是否有并行开销减慢程序速度?

parallel::mclapply的源代码包含这段代码:

 ... 
 if (cores < 2L) 
        return(lapply(X = X, FUN = FUN, ...))
 ... 

所以我相信答案是肯定的,你应该得到与直接使用 lapply 相同的结果,但也有一些额外的开销。我怀疑这会非常显着地影响运行时间。

文档还指出:

Details

mclapply is a parallelized version of lapply, provided mc.cores > 1: for mc.cores == 1 it simply calls lapply.