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.
我知道我不应该嵌套并行运算符,但我现在的情况是我基本上必须在我的代码中嵌套两个 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.