为什么这个代码中的Python多进程更慢?

2 投票
2 回答
1391 浏览
提问于 2025-04-17 08:09

我有一段示例代码。我在做一些数学计算(图论),想提高速度,所以决定使用多进程,但让我惊讶的是,这段代码的运行速度竟然比单进程版本还慢。

我本以为,如果你有一个列表,把它分成两半,然后启动两个进程,应该大约能节省一半的时间。我觉得我没有什么同步问题,那为什么会这么慢呢?

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 个回答

2

使用 multiprocessing.Pool.map() 可以把工作分配给多个工人(也就是多个进程),然后把结果汇总到一起。

下面有个例子,具体可以查看这里 http://docs.python.org/library/multiprocessing.html#multiprocessing.pool.AsyncResult.successful

3

与其使用多进程,不如尝试减少你分配的内存量。你现在只是把临时列表填满了内存,比如你传给进程的aList的两半,还有你在每个进程中创建的新列表newList。这很可能是导致运行速度慢的原因,因为大量的内存分配会产生很多垃圾,需要清理。

试着用下面的代码替换你所有的代码,然后测一下速度。

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

撰写回答