将地图结果作为键控字典返回

时间:2014-10-31 15:49:13

标签: python python-2.7 map

在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}

我想在每个矩阵上运行一些矩阵代数,使用multiprocessingPool.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()

但我怎么能说出哪个矩阵(listAB)产生了哪些结果呢?在一个理想的世界中,C最终会成为一个字典,其键入的密钥与results相同,并且值为结果。

注意:我不希望每次都必须将整个matrices列表传递给函数,因为这会产生大量数据开销,从而影响多处理的效果。

1 个答案:

答案 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()