2017-10-16 81 views
0

我目前正在重新设计一个程序来使用Python的多处理池。我的第一印象是执行时间增加而不是减少。因此,我得到了好奇,并写了一个小测试脚本: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更换简单,我得到以下的结果:

无多处理: 2.6226043701171875e-06

with multiprocessing:

1进程:3.1453816890716553

2工序:1.615351676940918

3工序:1.6125438213348389

4个过程:1.5159809589385986

老实说,我有点困惑,因为非多版本总是幅度的一些订单快。另外,进程号的增加似乎对运行时没有影响。因此,我有几个问题:

  1. 我是否在使用多处理时犯了一些错误?
  2. 我的测试功能是否简单以获得多处理的积极影响?
  3. 有没有机会估计多处理在哪一点上有优势,还是我必须测试它?
+1

对于小的任务产生新进程将大于时间的成本花在做工作。而且首先也不需要它。 – jonatan

+0

你的测试功能太简单了。产生过程和传递输入和结果相对于实际计算而言过于昂贵。 – timakro

回答

0

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

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