2014-03-25 108 views
1

爲njob> 1(njob = 2需要12.6s完成)花費更多時間的Joblib比njob = 1(1.3s完成)需要更多時間。我在Mac OSX 10.9中使用16GB RAM。我是否犯了一些錯誤?下面是一個簡單的演示代碼:joblib並行計算時間

from joblib import Parallel, delayed 
def func(): 
    for i in range(200): 
     for j in range(300): 
      yield i, j 

def evaluate(x): 
    i=x[0] 
    j=x[1] 
    p=i*j 
    return p, i, j 

if __name__ == '__main__': 
    results = Parallel(n_jobs=3, verbose=2)(delayed(evaluate)(x) for x in func()) 
    res, i, j = zip(*results) 
+0

另請參閱:http://stackoverflow.com/questions/21027477/joblib-parallel-multiple-cpus-slower-than-single 已經給出了這個問題的全面答案。 –

回答

1

簡短的回答:JOBLIB是一個多處理系統,並具有開銷爲每個3個同時工作的啓動了一個新的Python進程會比較大。因此,如果添加更多作業,您的特定代碼可能會變得更慢

有一些關於這個here的文檔。

的解決方法是不是很大:

  1. 接受的開銷
  2. 不使用並行代碼
  3. 使用multithreading,而不是多處理..不幸的是,多線程是很少的選擇,除非你正在使用一個完全編譯函數代替評估,因爲python幾乎總是單線程的(請參閱python GIL)。

也就是說,對於需要很長時間的函數,多處理往往是值得的。取決於您的應用程序,這確實是一個判斷呼叫。請注意,函數中使用的每個變量都被複制到每個進程 - python中的變量副本很少見,所以這可能是一個驚喜。因此,開銷部分是顯式或隱式傳遞的變量大小的函數(例如,通過使用全局變量)。