2017-10-16 211 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