为什么这段代码中的python多处理速度较慢?

时间:2011-12-11 11:59:28

标签: python multiprocessing

我有这个示例代码。我正在进行一些数学计算(图论),我想提高速度,所以我决定采用多处理,但令人惊讶的是,相同的代码运行速度甚至比单一进程版本还慢。

我希望如果你有一个列表并将其分成两半并开始两个过程,那么它应该花费大约一半的时间。我不认为我有一些同步问题所以为什么这么慢?

from multiprocessing import Process, Queue

def do_work(queue, aList):

    for elem in aList:
        newList.append(a_math_function(elem))

    queue.put(max(newList))
    return max(newList)

def foo():

    #I have let's say aList with 100000 objects

    q1 = Queue(); q2 = Queue()

    p1 = Process(target=do_work, args=[q1, aList[0: size/2])])
    p2 = Process(target=do_work, args=[q2, aList[size/2+1: size])])

    p1.start(); p2.start()
    p1.join(); p2.join()

    print(max(q1.get(),q2.get())

2 个答案:

答案 0 :(得分:3)

不要使用多处理,而是尝试减少正在进行的分配量。您只需使用临时列表填充RAM(例如,您传递进程的aList的一半,然后是您在每个进程中创建的newList列表)。很可能这是缓慢的原因,因为大量的分配意味着大量的垃圾收集。

尝试用此替换所有代码并测量速度。

def foo():
    print max(a_math_function(x) for x in aList)

答案 1 :(得分:2)

使用multiprocessing.Pool.map()在工作程序之间分配工作负载,并从中汇总结果。

请参阅下面的示例http://docs.python.org/library/multiprocessing.html#multiprocessing.pool.AsyncResult.successful