我有一个像这样工作的生成器函数(Python)
def Mygenerator(x, y, z, ...):
while True:
# code that makes two matrices based on sequences of input arrays
yield (matrix1, matrix2)
我想要做的是添加此生成器的输出。这条线完成了这项工作:
M1, M2 = reduce(lambda x, y: x[0] + y[0], x[1] + y[1], Mygenerator(x, y, z, ...))
我想将其并行化以加快计算速度。重要的是Mygenerator的输出会随着它的产生而减少,因为list(Mygenerator(...))
会占用太多内存。
答案 0 :(得分:3)
为了回答我自己的问题,我找到了一个似乎按照我的希望运作的解决方案:
首先,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
与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表达式中的x
和y
更改为r1
和r2
,以避免与其他具有相同名称的变量混淆。当试图使用multiprocessing
生成器时,我遇到了一些问题。
这个解决方案唯一令人失望的是,它并没有真正加快计算速度。我想这与开销操作有关。使用8个内核时,处理速度提高了约10%。当减少到4个核心时,速度加倍。这似乎是我可以用我的特定任务做的最好的,除非有其他方法进行并行化......
这里需要imap
函数,因为map
会在reduce
操作之前将所有返回的值存储在内存中,在这种情况下是不可能的。< / p>