「Pythonのコードを高速化したい」
そんな時は、Joblibで処理を並列化すると良いです。
普通に実行した場合
時間がかかる処理を普通に実行した場合をみてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from time import time # 0から9999までの値を足す def add_process(): sum_value=0 for i in range(10000): sum_value += i return sum_value start = time() r = 0 # add_processを1万回繰り返す for i in range(10000): r += add_process() print(r) print('{}秒かかりました'.format(time() - start)) |
まず、0から9999までを足し算するadd_process
関数を作ります。
さらに、add_process
関数を1万回実行してみます。計算量は1万×1万で1億です。
1 2 |
499950000000 4.97727632522583秒かかりました |
5秒程度かかりました。
並列化する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from time import time from joblib import Parallel, delayed # 0..9999までの値を足す def add_process(): sum_value=0 for i in range(10000): sum_value += i return sum_value start = time() r = 0 # add_processを1万回繰り返す、並列化、返り値はリスト r = Parallel(n_jobs=-1, verbose=10)( [delayed(add_process)() for i in range(10000)] ) print(sum(r)) print('{}秒かかりました'.format(time() - start)) |
並列化の書き方は以下の通り。
Parallel(パラメータ)([delayed(関数)(関数の引数) for ループ条件])
add_process
は引数が無いので何も指定しません。
n_jobs
で、CPUのコア数を指定します。1だと並列化せずに実行します。-1に指定すると最大のコア数で計算してくれます。
verbose
は並列計算のログの頻度を指定するパラメータです。デフォルトは0(ログ無し)で、1からログが出るようになり、10が最も高頻度になります。
Parallel
の返り値はリストです。
1 2 3 4 5 6 7 |
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 4 concurrent workers. : 499950000000 3.6274173259735107秒かかりました [Parallel(n_jobs=-1)]: Done 10000 out of 10000 | elapsed: 3.6s finished |
3.6秒に短縮されました。私のPCは安物の4コアなので思ったより短縮されませんでしたが、コア数が高ければ高いほど高速になります。
Pythonの処理に時間がかかっている場合は試してみてはいかがでしょうか。
おわり。