当涉及到全局 numpy 数组时,我对 Python 多处理有一些困惑。
考虑下面的玩具示例,传递的参数是一个整数,指示要求和的行。我的问题是:
每个处理器/工作人员都有 x 的副本吗?
例如,如果我通过实际行
pool.apply_async(sum, (x[i],))
并相应地更改函数 sum(),性能会如何变化。我的理解是传递的参数是 numpy 数组的视图,因此它不应该影响非并行程序中的任何内容。但是多处理程序呢?如果我用 joblib 包重写程序,
results = joblib.Parallel(n_jobs=-1, max_nbytes=1e6)(joblib.delayed(sum)(i) for i in xrange(len(x)))
每个处理器/工作人员都有自己的 x 副本吗?如果是这样,因为 x 是只读的,那么在工作人员之间共享的最简单方法是什么?
编码:
import numpy as np
from multiprocessing import Pool, cpu_count
def sum(idx):
"""
sum the idx row of global numpy array x
:idx: indicate which row
:returns: float sum
"""
return np.sum(x[idx])
x = np.random.random((10, 100))
pool = Pool(cpu_count())
result = {}
for i in xrange(len(x)):
result[i] = pool.apply_async(sum, (i,))
for k, v in result.iteritems():
print k, v.get()
谢谢你