使用Python作业库的双并行循环

使用Python作业库的双并行循环,python,parallel-processing,joblib,Python,Parallel Processing,Joblib,你好 我试图加速一个涉及许多独立积分的计算。为此,我使用pythons作业库和多处理。到目前为止,我已经成功地将我的计算的内循环并行化,但我想对外循环也这样做。由于并行编程扰乱了我的思维,我想知道是否有人能帮助我。到目前为止,我已经: from joblib import Parallel, delayed import multiprocessing N = 10 # Some number inputs = range(1,N,2) num_cores = multiprocessing

你好

我试图加速一个涉及许多独立积分的计算。为此,我使用pythons作业库和多处理。到目前为止,我已经成功地将我的计算的内循环并行化,但我想对外循环也这样做。由于并行编程扰乱了我的思维,我想知道是否有人能帮助我。到目前为止,我已经:

 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
次,并将所有内容相加。在这里,索引
m
只记录您希望运行处理函数并将结果相加的次数,而不记录其他次数。这允许您使用一层并行性来完成所有工作,即创建一个已经包含重复值的输入列表,并将该工作负载分配给核心。快速的直觉是,不是并行处理输入
[1,2,3,4]
,然后多次执行,而是并行运行输入
[1,1,1,2,2,2,3,3,3,4,4]
。下面是它的样子(我已经将您的函数更改为可以运行的更简单的函数)

ceil
是必需的,因为在原始循环中
m
每秒跳过一个值

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