Pythonで並列計算(Poolとmapを使う)
pythonで並列計算をしたいとき、Pool
とmap
を使うのが簡単だった。
C言語で並列計算して配列に格納する のと同じような感覚。
mapを使うのがカッコイイ。Haskellみたい。
簡単な例
- twiceFuncという名の関数 f(x) = 2x に
- argList = [1,2,3] の各要素を並列に代入して、
- resultList = [2,4,6] を得るプログラム
from multiprocessing import Pool def twiceFunc(arg): return 2 * arg if __name__ == '__main__': argList = [ 1, 2, 3] p = Pool() resultList = p.map(twiceFunc, argList) # resultList ... [ 2, 4, 6] print(resultList[0], resultList[1], resultList[2])
並列化された関数の終了を通知するテク
上記のコードのままでは、全計算が修了するまで結果が表示されないので不便。 そこで上記のtwiceFuncを以下のように変更すれば、各並列計算の終了がエラー出力に通知される。
from datetime import datetime def parallelCalcFunc(arg): # arg に計算をほどこして answer を作成 finStr = datetime.now().strftime("%Y/%m/%d %H:%M:%S") finStr += " arg:" + str(arg) finStr += " ans:" + str(answer) print(finStr, file=sys.stderr) return answer
参考
Python で並列計算 (multiprocessing モジュール) | 複数の引数を取る関数を map() メソッドで並列に走らせる