与非多处理执行时间相比,Python多处理池执行时间

时间:2017-10-16 11:11:30

标签: python multiprocessing

我目前正在重新设计一个程序来使用Python的多处理池。我的第一印象是执行时间增加而不是减少。因此,我很好奇并写了一个小测试脚本:

import time
import multiprocessing

def simple(x):
    return 2*x

def less_simple(x):
    b = x
    for i in range(0, 100):
        b = b * i
    return 2*x

a = list(range(0,1000000))

print("without multiprocessing:")
before = time.time()
res = map(simple, a)
after = time.time()
print(str(after - before))

print("-----")

print("with multiprocessing:")
for i in range(1, 5):
    before = time.time()
    with multiprocessing.Pool(processes=i) as pool:
        pool.map(simple, a)
    after = time.time()
    print(str(i) + " processes: " + str(after - before))

我得到以下结果:

没有多处理: 2.384185791015625e-06

多处理:

1个流程:0.35068225860595703

2个过程:0.21297240257263184

3个过程:0.21887946128845215

4个流程:0.3474385738372803

当我用第21行和第31行中的less_simple替换simple时,我得到以下结果:

没有多处理: 2.6226043701171875e-06

多处理:

1个流程:3.1453816890716553

2个流程:1.615351676940918

3个流程:1.6125438213348389

4个流程:1.5159809589385986

老实说,我有点困惑,因为非多处理版本总是快一些数量级。此外,进程数的增加似乎对运行时几乎没有影响。因此,我有几个问题:

  1. 我是否在使用多处理时犯了一些错误?
  2. 我的测试功能是否易于从多处理中获得积极影响?
  3. 是否有机会估计多处理在哪一点上有优势或者我必须对其进行测试?

1 个答案:

答案 0 :(得分:0)

我做了更多的研究,基本上,你是对的。这两个功能都相当小,有点人为。但是,当您考虑地图的工作原理时,即使对于这些功能,非多处理和多处理之间也存在可测量的时间差。 map函数只返回一个产生结果[1]的迭代器,即在上面的例子中,它只创建迭代器,当然它非常快。 因此,我用传统的for循环替换了map函数:

for elem in a:
    res = simple(a)

对于简单的函数,没有多处理,执行仍然更快,因为对于这么小的函数来说开销太大了:

  • 没有多处理:

    • 0.1392803192138672
  • 多处理:

    • 1个流程:0.38080787658691406
    • 2个流程:0.22507309913635254
    • 3个流程:0.21307945251464844
    • 4个流程:0.2152390480041504

但是,如果函数less_simple,您可以看到多处理的实际优势:

  • 没有多处理:

    • 3.2029929161071777
  • 多处理:

    • 1个流程:3.4934208393096924
    • 2个流程:1.8259460926055908
    • 3个流程:1.9196875095367432
    • 4个流程:1.716357946395874

[1] https://docs.python.org/3/library/functions.html#map