多处理执行比串行执行慢

时间:2019-07-16 03:14:32

标签: python python-2.7 python-multiprocessing

我正在尝试进行多处理,但是在我看来,多处理的结果是慢于串行执行。我尝试了以下发布的代码段,但对我来说结果较慢。我想使用我拥有的所有处理器来执行。还有一件事,有什么办法可以增强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

     

Multiproc:1000020执行时间:0.257400989532

2 个答案:

答案 0 :(得分:0)

这很容易解释,并且有一个常见的常见问题解答:为每个琐碎的计算启动一个新流程的开销极大地掩盖了并行执行的好处,尤其是在这种情况下,每次计算都有大量数据需要从调用方复制到执行程序。

答案 1 :(得分:0)

这并不奇怪。 Pool.apply函数在单独的过程中执行,这意味着一些事情。正如@tripleee的回答所提到的那样,启动该过程会产生开销,尽管我认为这并不能说明所有问题。 (这应该相对较快,并且远远低于100ms。)

要考虑的第二件事是需要进行一些数据传输,在这种情况下,该列表的大小约为8Mb。那必须在管道上移动,包括对物体进行酸洗和解酸。

如果您在函数中执行了更多的“工作”,则您会看到相对差异有所降低,尽管常量因子相似。对于下面的add方法,我得到了0.96s1.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