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

为什么此代码中的python多处理速度较慢?,python,multiprocessing,Python,Multiprocessing,我有这个示例代码。我正在做一些数学计算(图论),我想提高速度,所以我决定使用多进程,但令人惊讶的是,同样的代码运行速度甚至比单进程版本还要慢 我预计,如果你有一个列表,你把它一分为二,开始两个过程,它应该需要大约一半的时间。我不认为我有什么同步问题,为什么这么慢 from multiprocessing import Process, Queue def do_work(queue, aList): for elem in aList: newList.append(

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

我预计,如果你有一个列表,你把它一分为二,开始两个过程,它应该需要大约一半的时间。我不认为我有什么同步问题,为什么这么慢

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())

使用multiprocessing.Pool.map()在工作人员之间分配工作负载,并从中聚合结果


请参见下面的示例

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

尝试用这个替换所有代码并测量速度

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

我正在使用python 2.7.2,进程和队列来自库,我将编辑代码。你的
a\u math\u函数
在做什么?如果是CPython,它可能会通过“全局解释器锁”阻止解释器。CPython 2在多处理方面的一个已知缺陷。您是否将流程创建时间与实际工作进行了基准测试?您不需要创建中间列表(您的新列表)。很可能是由于内存的填充导致了垃圾收集的缓慢。您只需执行
result=max(列表中x的一个函数(x)
)即可解决此问题。我想不用说,您是在多处理器硬件上运行的吧?在单核机器上运行,无论是否超线程,您都不会得到任何好处。也许只需像这样将工作分配到一个_math_函数中,并将最大值的计算留给顶级进程
max(pool.imap\u无序(一个数学函数,aList,32))