使用Python Joblib的双并行循环

2024-10-01 17:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

再见

我试图加速一个涉及许多独立积分的计算。为此,我使用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之外完成,如果有任何其他改进建议,我们将不胜感激。在

谢谢你的回复。在


Tags: importnumberforparallelrangesomecnmultiprocessing
1条回答
网友
1楼 · 发布于 2024-10-01 17:35:01

如果我理解正确的话,您将运行函数processInput(n)以获得一个范围的n个值,并且需要执行m次并将所有内容相加。在这里,索引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每秒都会跳过一次值。在

相关问题 更多 >

    热门问题