python多处理和joblib参数传递

时间:2014-10-22 18:06:45

标签: python numpy multiprocessing joblib

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

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

  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是只读的,那么分享工人的最简单方法是什么?

  4. 代码:

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

    谢谢

0 个答案:

没有答案