2016-09-29 55 views
-1

我正在做一個簡單的多處理測試,看起來有些東西。我在i5-6200U 2.3 GHz的Turbo Boost上運行。Python多重處理 - 執行時間增加了,我做錯了什麼?

from multiprocessing import Process, Queue 
import time 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    jobs = [] 
    start_time = time.time() 
#####PARALLEL#################################### 
    for i in range(0,400): 
     p = p = Process(target= multiply, args= (5,i,queue1)) 
     jobs.append(p) 
     p.start() 

    for j in jobs: 
     j.join() 

    print("PARALLEL %s seconds ---" % (time.time() - start_time)) 
#####SERIAL################################ 
    start_time = time.time() 
    for i in range(0,400): 
     multiply(5,i,queue1) 
    print("SERIAL %s seconds ---" % (time.time() - start_time)) 

輸出:

PARALLEL 22.12951421737671 seconds --- 
SERIAL 0.004009723663330078 seconds --- 

幫助深表感謝。

+3

創建一個過程比乘以兩個小整數要昂貴得多;並創造出比CPU更多的進程使CPU變得更糟(所有進程在CPU週期有限的情況下相互爭奪)。要看到任何加速,每個工作進程中完成的「有用的工作」必須是非平凡的(需要更多的時間,而不是進程創建+銷燬和IPC(進程間通信)的開銷)。 –

+0

爲什麼要創建400個進程並將乘積值存儲到隊列中? – haifzhan

+0

我該如何正確地做到這一點呢?你能指點我正確的資源嗎?我應該使用游泳池還是什麼?我很困惑。我需要將這些值存儲到隊列中,因爲我需要獲取該進程的結果,並且通過Google搜索,排隊似乎成爲了做到這一點的方式。 – RandN88

回答

0

下面是一個簡單的(愚蠢)代碼的例子,它獲得了很好的加速。正如註釋中所述,它不會創建荒謬的進程數,並且與進程間通信開銷相比,每個遠程函數調用完成的工作量都很高。

import multiprocessing as mp 
import time 

def factor(n): 
    for i in range(n): 
     pass 
    return n 

if __name__ == "__main__": 
    ns = range(100000, 110000) 

    s = time.time() 
    p = mp.Pool(4) 
    got = p.map(factor, ns) 
    print(time.time() - s) 
    assert got == list(ns) 

    s = time.time() 
    got = [factor(n) for n in ns] 
    print(time.time() - s) 
    assert got == list(ns) 
+0

謝謝!這有很大幫助。但是,我將如何通過二維數組(如圖像)而不是n?這是我很困惑的一部分。爲了獲得價值,我還需要使用隊列嗎? – RandN88

+0

盯着代碼,你會看到它_does_返回'factor()'的結果。我不知道「二維數組(像一個圖像)」是什麼意思,確切地說。 「2D數組」和「圖像」不是內建的Python類型。細節很重要。總之,任何可以被醃製的東西都可以傳遞和/或返回 –

+0

謝謝蒂姆,這可以幫助我解決很多問題:) – RandN88