1

当涉及到全局 numpy 数组时,我对 Python 多处理有一些困惑。

考虑下面的玩具示例,传递的参数是一个整数,指示要求和的行。我的问题是:

  1. 每个处理器/工作人员都有 x 的副本吗?

  2. 例如,如果我通过实际行pool.apply_async(sum, (x[i],))并相应地更改函数 sum(),性能会如何变化。我的理解是传递的参数是 numpy 数组的视图,因此它不应该影响非并行程序中的任何内容。但是多处理程序呢?

  3. 如果我用 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()

谢谢你

4

0 回答 0