2016-05-07 4 views
1

コードが1つ重いループを改善するためには、スピードアップが必要です。このようなコードに対してマルチプロセスを実装するにはどうすればよいですか? Numba(又はcython)と共にThreadPoolExecutorHeavyComputationThatIsThreadSafe1機能のみ配列としないPythonオブジェクトを使用している場合、私はconcurrent futures(又はpython2 backport)を使用してなるマルチプロセッシングネストされた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

[あなたの他の質問](http://stackoverflow.com/q/37081288/1461210)へのShadowRangerのコメントはまだありません - あなたがコミットしているならば、世界のすべてのスレッドはほとんど窪みを作っていません「HeavyComputationThatIsThreadSafe1' *を10億回以上呼び出す*。 'HeavyComputationThatIsThreadSafe1'への一回の呼び出しにかかる時間は何秒ですか?その数を1073741824で掛けて、あなたが持っているコアの数で割ってください。これにより、マルチプロセッシングで実現できる最高のシナリオの実行時間が得られます。 –

+0

リンク先の[HeavyComputationThatiIsThreadSafe'(http://stackoverflow.com/a/37100607/392949)のパフォーマンス上の問題に対処しました。あなたが言及したデータサイズであっても、合理的な最適化セットを取る場合、3つのネストされたループ全体を処理するには、8GB〜45GBのメモリしか必要としません。 – JoshAdel

答えて

2

(Aは10サイズ2およびLまでの典型的なものです) GILがリリースされました。それ以外の場合はProcessPoolExecutorを使用します。

参照:

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

あなたは、最も外側のループのレベルで計算を並列化し、その後、各スレッド/プロセスから生じる塊からoutputを埋めるためにしたいと思います。これは、そうするコストが計算よりもはるかに安いことを前提としています。

関連する問題