对于 C++,我们可以使用 OpenMP 进行并行编程;但是,OpenMP 不适用于 Python。如果我想并行我的 python 程序的某些部分,我应该怎么做?
代码的结构可以认为是:
solve1(A) solve2(B)
wheresolve1和solve2是两个独立的函数。如何并行而不是顺序运行这种代码以减少运行时间?代码是:
solve1
solve2
def solve(Q, G, n): i = 0 tol = 10 ** -4 while i < 1000: inneropt, partition, x = setinner(Q, G, n) outeropt = setouter(Q, G, n) if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol: break node1 = partition[0] node2 = partition[1] G = updateGraph(G, node1, node2) if i == 999: print "Maximum iteration reaches" print inneropt
wheresetinner和setouter是两个独立的函数。那就是我要并行的地方…
setinner
setouter
您可以使用多处理模块。对于这种情况,我可能会使用处理池:
from multiprocessing import Pool pool = Pool() result1 = pool.apply_async(solve1, [A]) # evaluate "solve1(A)" asynchronously result2 = pool.apply_async(solve2, [B]) # evaluate "solve2(B)" asynchronously answer1 = result1.get(timeout=10) answer2 = result2.get(timeout=10)
这将产生可以为您完成通用工作的进程。由于我们没有通过processes,它将为您机器上的每个 CPU 内核生成一个进程。每个 CPU 内核可以同时执行一个进程。
processes
如果要将列表映射到单个函数,可以这样做:
args = [A, B] results = pool.map(solve1, args)
不要使用线程,因为GIL会锁定对 python 对象的任何操作。