阅读doparallel的小插图。
以下两个代码是否相同?
>>>def change(x):
... x.append(len(x))
... return x
>>>a=[]
>>>b=(change(a) for i in range(3))
>>>next(b)
[0]
>>>next(b)
[0,1]
>>>next(b)
[0,1,2]
>>>next(b)
Traceback ... StopIteration
>>>a=[]
>>>b=(change(a) for i in range(3))
>>>list(b) #expecting [[0],[0,1],[0,1,2]]
[[0,1,2],[0,1,2],[0,1,2]]
与此基本相同:
library(doparallel)
no_cores <- 8
cl <- makeCluster(no_cores)
registerDoParallel(cl)
pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff}
如果我想使用多核,那么在使用doparallel时我必须library(doparallel)
registerDoParallel(cores = 8)
pieces <- foreach(i = seq_len(length(pieces))) %dopar% { # do stuff}
吗?或者是单行足够makeCluster()
答案 0 :(得分:2)
在Windows机器上,这两个示例基本相同。唯一的区别是第一个示例使用显式集群对象,第二个示例使用在执行registerDoParallel
时创建的隐式集群对象。这两个例子的表现应该是一样的。
在Mac或Linux计算机上,第一个示例使用snow
派生的后端(与Windows计算机上完全相同),最终使用clusterApplyLB
执行并行计算。第二个示例使用multicore
派生的后端(Windows上从未提供),最终使用mclapply
执行并行计算,这可能比第一个示例更有效。