余白の書きなぐり

aueweのブログ

Pythonで並列計算(Poolとmapを使う)

pythonで並列計算をしたいとき、Poolmapを使うのが簡単だった。 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() メソッドで並列に走らせる