对于C++,我们可以使用OpenMP进行并行编程;但是,OpenMP不适用于Python.如果我想并行我的python程序的某些部分,我应该怎么做?
代码的结构可以被认为是:
solve1(A)
solve2(B)
其中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
其中setinner
和setouter
是两个独立的函数。这就是我想要比较的地方。
发布于 2013-12-13 00:39:19
您可以使用multiprocessing模块。在这种情况下,我可能会使用一个处理池:
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核心可以同时执行一个进程。
如果你想把一个列表映射到一个函数,你可以这样做:
args = [A, B]
results = pool.map(solve1, args)
不要使用线程,因为GIL会锁定python对象上的所有操作。
发布于 2013-12-13 00:38:20
CPython使用全局解释器锁,这使得并行编程比C++更有趣
本主题提供了几个有关挑战的有用示例和说明:
Python Global Interpreter Lock (GIL) workaround on multi-core systems using taskset on Linux?
发布于 2019-10-06 23:01:55
在某些情况下,可以使用Numba自动并行化循环,尽管它只适用于Python子集:
from numba import njit, prange
@njit(parallel=True)
def prange_test(A):
s = 0
# Without "parallel=True" in the jit-decorator
# the prange statement is equivalent to range
for i in prange(A.shape[0]):
s += A[i]
return s
不幸的是,Numba似乎只适用于Numpy数组,而不适用于其他Python对象。从理论上讲,也可以先使用compile Python to C++,然后使用automatically parallelize it using the Intel C++ compiler,尽管我还没有尝试过。
https://stackoverflow.com/questions/20548628
复制相似问题