====== 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>プログラミング}}