====== 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 ...'' というエラーが現れる。
* 参考サイト: [[https://qiita.com/yamasakih/items/ed806c1c46a56c1f884a | sqlalchemyで取り出したレコードをjoblibの引数にすると出るエラーへの対処 - Qiita]]
===== 参考サイト =====
* [[http://own-search-and-study.xyz/2018/01/17/joblib%E3%81%AEparallel%E3%81%AE%E5%85%A8%E5%BC%95%E6%95%B0%E3%82%92%E8%A7%A3%E8%AA%AC/ | JoblibのParallelの全引数を解説 | 自調自考の旅]]
{{tag>プログラミング}}