2012-06-27 70 views
4

我寫的這段代碼來測試Python的多我的電腦上:Python的多速度

from multiprocessing import Pool 

var = range(5000000) 
def test_func(i): 
    return i+1 

if __name__ == '__main__': 
    p = Pool() 
    var = p.map(test_func, var) 

我計時此使用Unix的time命令,結果是:

real 0m2.914s 
user 0m4.705s 
sys 0m1.406s 

然後,使用同樣vartest_func()我計時:

var = map(test_func, var) 

,結果我們再

real 0m1.785s 
user 0m1.548s 
sys 0m0.214s 

不應該多碼比普通的老map快得多?

回答

5

爲什麼它應該。

在map函數中,您只是按順序調用函數。

多處理池創建一組將要映射任務的工作人員。 它正在協調多個工作進程來運行這些功能。

嘗試在你的函數中做一些重要的工作,然後計算它們,看看多處理能否幫助你更快計算。

您必須明白,使用多處理會產生開銷。只有在計算工作量明顯大於這些開銷時,您纔會看到它的好處。

由赫爾曼見出色地介紹了最後一個例子:http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html

pool_size = multiprocessing.cpu_count() * 2 
pool = multiprocessing.Pool(processes=pool_size, 
          initializer=start_process, 
          maxtasksperchild=2, 
          ) 
pool_outputs = pool.map(do_calculation, inputs) 

創建取決於你有內核池。

3

使用並行化存在開銷。如果每個工作單位花費足夠的時間來補償開銷,那麼只有好處。

此外,如果您的計算機上只有一個CPU(或CPU線程),則完全沒有必要使用並行化。如果您至少擁有一臺超線程機器或至少兩個CPU內核,則只會看到收益。

在你的情況下,一個簡單的加法操作不會補償這種開銷。

嘗試一些更昂貴,如:

from multiprocessing import Pool 
import math 

def test_func(i): 
    j = 0 
    for x in xrange(1000000): 
     j += math.atan2(i, i) 
    return j 

if __name__ == '__main__': 
    var = range(500) 
    p = Pool() 
    var = p.map(test_func, var)