2016-05-07 88 views
1

爲了提高我的代碼有一個重循環,我需要加快速度。我怎樣才能爲這樣的代碼實現多處理? (a是典型尺寸2和L可達10)多處理嵌套python循環

for x1 in range(a**l): 
    for x2 in range(a**l): 
     for x3 in range(a**l): 
      output[x1,x2,x3] = HeavyComputationThatIsThreadSafe1(x1,x2,x3) 
+0

ShadowRanger對[您的其他問題](http://stackoverflow.com/q/37081288/1461210)的評論仍然存在 - 如果您致力於世界各地的所有主題都不會造成太大的影響呼叫'HeavyComputationThatIsThreadSafe1' *超過十億次*。一次調用'HeavyComputationThatIsThreadSafe1'多少秒?取這個數字,乘以1073741824併除以你擁有的核心數量。這爲您提供了可以通過多處理實現的絕對最佳情況場景運行時。 –

+0

我解決了與您鏈接的[原始問題](http://stackoverflow.com/a/37100607/392949)中的'HeavyComputationThatiIsThreadSafe'的性能問題。即使你提到的數據大小,如果你採取了一些合理的優化設置,它只需要~8GB的內存和45s來遍歷所有三個嵌套循環。 – JoshAdel

回答

2

如果HeavyComputationThatIsThreadSafe1函數只使用陣列和不Python對象,我會使用concurrent futures(或python2 backportThreadPoolExecutor連同Numba(或cython)隨着GIL的發佈。否則使用ProcessPoolExecutor

請參見:

http://numba.pydata.org/numba-doc/latest/user/examples.html#multi-threading

你想要在最外層循環的水平,並行計算和,然後填寫從每個線程/進程造成的大塊output。這假定這樣做的成本比計算便宜得多,情況應該如此。