与Python Joblib的双重并行循环

问题描述:

美好的一天与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之外完成,并且任何其他改进建议都将被赞赏。

感谢您的回复。

如果我理解正确,那么对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跳过每秒值。