首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中进行并行编程?

如何在Python中进行并行编程?
EN

Stack Overflow用户
提问于 2013-12-13 00:19:17
回答 4查看 283.8K关注 0票数 167

对于C++,我们可以使用OpenMP进行并行编程;但是,OpenMP不适用于Python.如果我想并行我的python程序的某些部分,我应该怎么做?

代码的结构可以被认为是:

代码语言:javascript
复制
solve1(A)
solve2(B)

其中solve1solve2是两个独立的函数。如何并行运行这类代码,而不是按顺序运行,以减少运行时间?代码是:

代码语言:javascript
复制
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

其中setinnersetouter是两个独立的函数。这就是我想要比较的地方。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-13 00:39:19

您可以使用multiprocessing模块。在这种情况下,我可能会使用一个处理池:

代码语言:javascript
复制
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核心可以同时执行一个进程。

如果你想把一个列表映射到一个函数,你可以这样做:

代码语言:javascript
复制
args = [A, B]
results = pool.map(solve1, args)

不要使用线程,因为GIL会锁定python对象上的所有操作。

票数 191
EN

Stack Overflow用户

发布于 2013-12-13 00:38:20

CPython使用全局解释器锁,这使得并行编程比C++更有趣

本主题提供了几个有关挑战的有用示例和说明:

Python Global Interpreter Lock (GIL) workaround on multi-core systems using taskset on Linux?

票数 6
EN

Stack Overflow用户

发布于 2019-10-06 23:01:55

在某些情况下,可以使用Numba自动并行化循环,尽管它只适用于Python子集:

代码语言:javascript
复制
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,尽管我还没有尝试过。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20548628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档