在Python 2.7中有一个包含大numpy
矩阵的字典,用矩阵的名称键入:
import multiprocessing as mp
import numpy as np
names = ['A', 'B', 'C']
size = 40
matrices = {k:np.random.random([size,size]) for k in names}
我想在每个矩阵上运行一些矩阵代数,使用multiprocessing
库Pool.map
,根据文档,它是与普通python {{1}的平行等价物。 (所以如果我可以使用内置地图执行此操作,我也可以使用map
执行此操作...)
Pool.map
这会将我的结果视为def hard_maths(matrix):
return np.dot(np.linalg.inv(matrix),
matrix).round(0)
pool = mp.Pool()
results = pool.map(hard_maths, matrices.itervalues())
pool.close()
pool.join()
。
但我怎么能说出哪个矩阵(list
,A
或B
)产生了哪些结果呢?在一个理想的世界中,C
最终会成为一个字典,其键入的密钥与results
相同,并且值为结果。
注意:我不希望每次都必须将整个matrices
列表传递给函数,因为这会产生大量数据开销,从而影响多处理的效果。
答案 0 :(得分:1)
只需使用值传递名称,然后返回:
def hard_maths(name_matrix):
name, matrix = name_matrix
return name, np.dot(np.linalg.inv(matrix),
matrix).round(0)
pool = mp.Pool()
results = pool.map(hard_maths, matrices.iteritems())
pool.close()
pool.join()
在linux上,多处理是通过分叉实现的。只要在创建池时存在矩阵,它就已经存在于子进程空间中,只需传递名称就可以减少开销
def hard_maths(name):
return name, np.dot(np.linalg.inv(matricies[name]),
matrix).round(0)
pool = mp.Pool()
results = pool.map(hard_maths, matrices.iterkeys())
pool.close()
pool.join()