首页 > 解决方案 > 多处理执行比串行执行慢

问题描述

我正在尝试进行多处理,但在我的情况下,多处理似乎最终会比串行执行慢。我尝试了下面发布的代码段,结果对我来说比较慢。我想使用我拥有的所有处理器来执行。还有一件事,有没有办法提升 for 循环和嵌套的 for 循环。

import multiprocessing
import time

def add(a ,b ,c):
    d = 0
    for i in range(len(a)):
        d = a[i] + b + c
    return d

a = list()

for i in range(999999):
    a.append(i)

b = a[2] + a[9]
c = a[3] + a[8]

#Serial
execTime = time.time()
res = add(a, b, c)
print "Serial:    " + str(res) + " Exec Time: " + str(time.time() - execTime)

#Multiprocessing
execTimeMult = time.time()
resSet = [a, b, c]

cpu = multiprocessing.cpu_count()
pool = multiprocessing.Pool(cpu)
res = pool.apply(add, resSet)

print "Multiproc: " + str(res) + " Exec Time: " + str(time.time() - execTimeMult)

结果:

序列号:1000020 执行时间:0.0912199020386

多进程:1000020 执行时间:0.257400989532

标签: pythonpython-2.7python-multiprocessing

解决方案


这并不奇怪。该Pool.apply功能在单独的进程中执行,这意味着一些事情。正如@tripleee 的回答所提到的,启动该过程存在开销,尽管我认为这并不能解释一切。(这应该相对较快,并且远低于 100 毫秒。)

要考虑的第二件事是需要一些数据传输,在本例中是一个大约 8Mb 的列表。这必须在管道上移动,包括对物体进行酸洗和解酸。

如果你在函数中执行了更多的“工作”,你会看到相对差异下降,尽管常数因子是相似的。对于add像下面这样的方法,我得到了0.96sand的时间1.09s。所以常数因子相同,但相对差异显然要小得多。

def add(a, b, c):
    for _ in range(10):
        d = 0
        for i in range(len(a)):
            d = a[i] + b + c
    return d

推荐阅读