2015-11-07 11 views
0

我已經看到了很多關於使用python的multiprocessing的問題,但是我還沒有能夠在我的代碼中如何使用它。Python中的並行編程數組處理

假設我有一個NxM數組。我有一個函數f比較(i,j)與其他每個像素的值。所以,本質上,我計算網格上每個點的NxM值。

我的機器有四個內核。我想我會將輸入位置分成四個象限,然後將每個象限送入不同的過程。

所以,schemetically,我當前的代碼是:

def f(x, array): 
    """ 
    For input location x, do some operation 
    with every other array value. As a simple example, 
    this could be the product of array[x] with all other 
    array values 
    """ 
    return array[x]*array 

if __name__ == '__main__': 
    array = some_array 
    for x in range(array.size): 
     returnval = f(x,array) 

`

什麼是在這樣的利用多重優化問題的最佳策略是什麼?

+0

你想如何存儲答案?在另一個陣列? – bbayles

+0

如果你的問題是數學上的,你可能想看看'numpy'。儘管在CPython中綁定了GIL的單核性能,但numpy代碼會釋放它,所以您的代碼在使用線程+ numpy時比使用多處理時更有效。 – myaut

+0

@bbayles是的,它必須是另一個相同大小的數組,NxM。因此保留訂單非常重要。 – user1991

回答

0

您所描述的策略 ​​- 將數據集發送給幾個工作人員,每個數據集都有部分數據計算值,並在最後將它們連接在一起 - 這是對像這樣的算法進行並行計算的經典方法答案不相互依賴。這是MapReduce

也就是說,引入並行性會使程序更難理解,以後很難適應或改進。您所描述的算法和用於大型數值計算的原始Python都可能是首要改變的更好的事情。

考慮檢查使用numpy數組來表達您的計算是否會使其運行速度更快,以及是否可以在並行化代碼之前爲您要解決的問題找到或開發更高效的算法。

1

multiprocessing庫可以完成大部分繁重的工作,包括其Pool.map函數。

唯一的限制是將使用一個函數,它接受一個參數,即您正在迭代的值。根據this other question,最終的實施將是。

from multiprocessing import Pool 
from functools import partial 

# Make a version of f that only takes x parameter 
partial_f = partial(f, array=SOME_ARRAY) 

if __name__ == '__main__': 
    pool = Pool(processes=5) # Number of CPUs + 1 
    returnval = pool.map(partial_f, range(array.size))