为了回答我自己的问题,我找到了一个似乎可以正常工作的解决方案:
首先,Mygenerator
不再是生成器而是函数。此外,我现在不再循环遍历 x、y 和 z 的段,而是将一个段传递给函数:
def Myfunction(x_segment, y_segment, z_segment):
# code that makes two matrices based on input arrays
return (matrix1, matrix2)
multiprocessing.Pool
与(generator) 函数一起使用imap
似乎有效:
pool = multiprocessing.Pool(ncpus)
results = pool.imap(Myfunction,
( (x[i], y[i], z[i]) for i in range(len(x)) )
M1, M2 = reduce(lambda r1, r2: (r1[0] + r2[0], r1[1] + r2[1]),
(result for result in results))
pool.close()
pool.join()
我将lambda 表达式中的 and 更改为andx
以避免与其他同名变量混淆。当尝试使用发电机时, 我遇到了泡菜的一些麻烦。y
r1
r2
multiprocessing
这个解决方案唯一令人失望的是它并没有真正加快计算速度。我想这与开销操作有关。使用 8 核时,处理速度提高了约 10%。当减少到 4 个核心时,速度翻了一番。这似乎是我能用我的特定任务做的最好的,除非有一些其他的方法来做并行化......
imap
此处必须使用该函数,因为map
它将在操作之前将所有返回值存储在内存中reduce
,在这种情况下这是不可能的。