我对如何使用yield并行分配大型对称矩阵有疑问。由于每个项目的处理速度都相对较快,所以我发现它的最佳方法是使每一行平行。
下面是我在使用imap_unordered的yield时遇到的问题的一个示例。
import multiprocessing as mp
import random
import numpy as np
def func(param):
i, js = param
for j in js:
yield i,j,random.random()
N=100
M = np.eye(N, dtype=np.float)
params_parallel = [ (i, range(i)) for i in range(N) ]
with mp.Pool(processes=4) as p:
for (i,j,value) in p.imap_unordered( func, params_parallel ):
M[i,j] = M[j,i] = value
我得到以下结果:
Traceback (most recent call last):
File "test_parallel.py", line 15, in <module>
for (i,j,value) in p.imap_unordered( func, params_parallel ):
File "/usr/lib/python3.6/multiprocessing/pool.py", line 761, in next
raise value
multiprocessing.pool.MaybeEncodingError: Error sending result: '<generator object func at 0x7fb6ae377780>'. Reason: 'TypeError("can't pickle generator objects",)'
ps .:我不能使用:
if __name__ == '__main__'