2016-12-14 103 views
2

美好的一天與Python Joblib的雙重並行循環

我想加快涉及許多獨立集成的計算。爲此,我使用pythons Joblib和多處理。到目前爲止,我已經成功地將我的計算的內部循環並行化了,但我想對外部循環做同樣的事情。由於並行編程伴隨着我的思維混亂,我想知道是否有人可以幫助我。到目前爲止,我有:

from joblib import Parallel, delayed 
import multiprocessing 

N = 10 # Some number 
inputs = range(1,N,2) 
num_cores = multiprocessing.cpu_count() 

def processInput(n): 
    u_1 = lambda x,y: f(x,y)g(n,m) # Some function 
    Cn = scintegrate.nquad(u_1, [[A,B],[C,D]]) # A number 
    return Cn*F(x,y)*G(n,m) 

resultsN = [] 

for m in range(1,N,2): # How can this be parallelized? 
    add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in inputs) 
    resultsN = add + resultsN 

resultsN = sum(resultsN) 

這到目前爲止產生了正確的結果。現在我想用外循環做同樣的事情。有沒有人有一個想法,我可以做到這一點?

我也想知道u_1聲明是否可以在processInput之外完成,並且任何其他改進建議都將被讚賞。

感謝您的回覆。

回答

2

如果我理解正確,那麼對n值範圍運行函數processInput(n),並且您需要執行該操作並將所有內容添加在一起。在這裏,索引m只會記錄您想要運行處理函數的次數,並將結果添加到一起,但沒有別的。這使您可以僅使用一層並行處理來完成所有任務,即創建一個已包含重複值的輸入列表,並將該工作負載分配給您的內核。快速的直覺是,並行處理輸入[1,2,3,4]而不是處理輸入,然後多次執行並行輸入[1,1,1,2,2,2,3,3,3,4,4,4]。這是它可能看起來像(我已經改變你的功能,我可以運行一個更簡單的功能)。

import numpy as np 
from joblib import Parallel, delayed 
import multiprocessing 
from math import ceil 

N = 10 # Some number 
inputs = range(1,N,2) 
num_cores = multiprocessing.cpu_count() 

def processInput(n): # toy function 
    return n 

resultsN = [] 
# your original solution with an additional loop that needs 
# to be parallelized 
for m in range(1,N,2): 
    add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in inputs) 
    resultsN = add + resultsN 
resultsN = sum(resultsN) 
print resultsN 

# solution with only one layer of parallelization 
ext_inputs = np.repeat(inputs,ceil(m/2.0)).tolist() 
add = Parallel(n_jobs=num_cores)(delayed(processInput)(n) for n in ext_inputs) 
resultsN = sum(add) 
print resultsN 

ceil是必需的,因爲你原來的循環m跳過每秒值。