2016-01-16 101 views
0

多線程的性能增益我試圖從比較並行計算使用多線程模塊和正常順序的計算性能增益,但無法找到任何真正的區別。下面是我所做的:評估從蟒蛇

import time, threading, Queue 
q=Queue.Queue() 

def calc(_range): 
    exponent=(x**5 for x in _range) 
    q.put([x**0.5 for x in exponent]) 

def calc1(_range): 
    exponent=(x**5 for x in _range) 
    return [x**0.5 for x in exponent] 

def multithreds(threadlist): 
    d=[] 
    for x in threadlist: 
     t=threading.Thread(target=calc, args=([x])) 
     t.start() 
     t.join() 
     s=q.get() 
     d.append(s) 
    return d 


threads=[range(100000), range(200000)] 

start=time.time() 
#out=multithreads(threads) 
out1=[calc1(x)for x in threads] 
end=time.time() 
print end-start 

定時使用線程:0.9390001297 定時順序運行:0.911999940872

順序運行的時機不斷比使用多線程低。 我有一種感覺,我的多線程代碼有問題。

有人點我在正確的方向吧。 謝謝。

+0

你爲什麼有兩個'calc'的功能呢? – ForceBru

+0

其中之一是用於多線程,因爲我希望隊列中返回輸出。因此我使用了一個用於線程,另一個用於序列。 – user2274879

+0

考慮一個更昂貴的函數調用 - fork或啓動線程不是免費的,因此對於非常小的調用,與實際的「工作」相比,初始化開銷非常不平凡。 –

回答

1

參考實現的Python(CPython的)的具有所謂的解釋器鎖定在那裏總是一個線程執行的Python字節碼。例如,您可以切換到沒有GIL的IronPython,或者您可以查看多處理模塊,該模塊會生成幾個可獨立執行您的代碼的Python進程。在某些情況下,使用Python中的線程甚至可能比單線程慢,因爲CPU上線程之間的上下文切換也會帶來一些開銷。

採取一些更深刻的見解和幫助看看at this page

如果你想深入這個話題更加更深,我可以由大衛比茲利強烈推薦this talk

+0

我會考慮IronPython,因爲我無法導入多處理模塊。但是,只要CPython中有線程化,就可以使用多線程。我相信有一條出路。謝謝。 – user2274879

+0

我試過導入多處理模塊,但得到這個錯誤信息:'no module named dummy'。但是我檢查了python目錄下的多處理文件,發現了虛擬。有什麼建議做什麼? – user2274879

+0

CPython可以實現多線程,但由於GIL,通過多線程從多個內核獲得加速的可能性不大。 –