python3でちょいちょいコードを書いてて計算時間が遅いことに色々とイラついてきた
本当はpythonなんか使いたくないんやけど、しょうがないから並列化処理をして早くする
幸い今回のジョブは完全に独立で走らせても最後にまとめられればOK、かつ計算の順番は問わないものなので並列化難易度はかなり低い
ひとまずpythonで並列化のためのライブラリがどんなものがあるのか調べてみた
2019年7月の記事でわかりやすくまとまってるのがあった
python3まで網羅してくれてるのでありがたい
■ 参考 : Pythonの並列処理・並行処理をしっかり調べてみた
thread : python2向けで古い
threading : python3で使える、threadの上位互換
concurrent.futures : threadingの上位互換
他にも
multiprocessing
Joblib
asyncio
とかがあるっぽい
最初の記事を読んでthreadingを使おうとしてみたけど、わからん・・・
その後、multiprocessingの方を使おうとしてみたがこれまたわからん
一応メモだけしとく・・・
■ 参考 : [Python] マルチプロセスな処理を実装して、処理を高速化する
■ 参考 : pythonの並列計算(CPUの数だけ並列させる)
結局、joblibというライブラリを使って並列化する
コードはめちゃくちゃシンプル
def wrapper_parallel_function(i):
parallel_function(arg1, arg2, arg3, data[i])
return data[i]
out = Parallel(n_jobs=-1)([delayed(wrapper_parallel_function)(i) for i in range(len((data)))])
parallel_functionという関数がもともとあって、それを並列化したい
関数の引数は色々とあるけど、dataというリストについて並列化したい
引数がいっぱいあるので、それをまとめてラッパーを用意する
Parallelという関数でラッパー関数を並列化する
out = Parallel(....というところで、dataという配列を1つ1つラッパーに渡している
みたいな感じだと思う
■ 参考 : PythonのJoblibによる並列計算について
この記事にも書いてあるけど、並列化の処理の終了順がジョブ依存なので
出力される順番もランダムになる
それを回避するには記事のように出力結果にデータのindexを入れておき、
それを後でソートする方法がある
ランキング参加中です
↓クリックしていただけると嬉しいです〜