Python モジュール: joblib

  • 並列計算をするためのモジュール

モジュールの読み込み

from joblib import Parallel, delayed

並列計算用の関数の作成

  • 並列計算のためには、worker となる並列実行内容を記述した関数が必要となるので作成する。
    from time import sleep
    def worker(i, n):
    	sleep(n)
    	return i
    • 今回は、n 秒待機して、インデックス i を返す関数とする。

並列計算の実行 (呼び出し)

  • 並列計算をリスト内包表記で記述する。
    x = [5,2,6]
    results = Parallel(n_jobs = 4, verbose = 10)([delayed(worker)(i, n) for i, n in enumerate(x)])
    print(results)
    • n_jobs: 並列実行数 (今回は 4)。-1 ですべてのコアを使う。
    • verbose: 実行状況を表示する。数字は出力頻度。
    • worker: 前に定義した並列処理したい関数の名前
    • (i, n): 関数に与える引数
  • 結果
    [0, 1, 2]
  • この処理は、逐次処理すると、5 + 2 + 6 = 13 秒かかるが、並列処理しているので、最長の 6 秒しかかからない。
  • 結果は、リストに順次格納される。
  • joblib は内部で、関数を pickle 化して計算するらしいので、pickle 化できない引数 (クラスなど) 与えたり、関数内でグローバル変数を利用したりすると、Can't pickle … というエラーが現れる。