2017-10-13 141 views
0

我想集成並行處理以使我的for循環運行得更快。Python:Joblib中的並行處理使代碼運行速度更慢

但是,我注意到它只是讓我的代碼運行得更慢。請參閱下面的示例,其中我使用joblib,並在隨機整數列表上使用了簡單函數。請注意,沒有的並行處理運行速度快於

任何有關正在發生的事情的見解?

def f(x): 
    return x**x 

if __name__ == '__main__': 
    s = [random.randint(0, 100) for _ in range(0, 10000)] 


    # without parallel processing 
    t0 = time.time() 
    out1 = [f(x) for x in s] 
    t1 = time.time() 
    print("without parallel processing: ", t1 - t0) 

    # with parallel processing 
    t0 = time.time() 
    out2 = Parallel(n_jobs=8, batch_size=len(s), backend="threading")(delayed(f)(x) for x in s) 
    t1 = time.time() 
    print("with parallel processing: ", t1 - t0) 

我得到以下輸出:

without parallel processing: 0.0070569515228271484 
with parallel processing:  0.10714387893676758 
+0

並行處理,因爲涉及到更復雜的安裝程序的額外開銷。您通常不希望並行完成需要微秒的任務。 – Muposat

+0

我也試過它在一個更復雜的模糊匹配函數,它仍然花了很長時間 –

+0

[爲什麼以下簡單的並行化代碼比Python中的簡單循環慢得多?](https://stackoverflow.com/questions/46727090/why-the-following-simple-parallelized-code-slow-than-a-simple-loop-in) – user3666197

回答

0

參數batch_size=len(s)有效說給每一個進程一批的工作之一。這意味着您創建8個線程,但是將所有工作負載分配給1個線程。

此外,您可能還想增加工作量以獲得可測量的優勢。我更喜歡使用time.sleep延遲:

def f(x): 
    time.sleep(0.001) 
    return x**x 

out2 = Parallel(n_jobs=8, 
       #batch_size=len(s), 
       backend="threading")(delayed(f)(x) for x in s) 

無並行處理:11.562264442443848

與並行處理:1.412865400314331

+0

主席先生,在尊重阿姆達爾定律的同時,加入f()的睡眠正在產生虛幻的錯覺。 [PARALLEL] -fraction(這裏)非常小,[SERIAL]部分支配並在[PARALLEL]部分添加睡眠() - 並不會提高處理性能,但會扭曲[ SER] + [PAR]/1 v/s [SER] + [PAR]/N。通過添加sleep(),[PAR] -Setup和[PAR] -Terminate開銷的成本更加「掩蓋」了。 – user3666197

相關問題