我对Python多处理有一些困惑,当它涉及全局numpy数组时。
考虑以下玩具示例,传递的参数是一个整数,表示要求和的行。我的问题是:
每个处理器/工作人员都有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()
谢谢