【Python】Joblibで処理を並列化する

 

「Pythonのコードを高速化したい」

そんな時は、Joblibで処理を並列化すると良いです。

 

[toc]

 

普通に実行した場合

 

時間がかかる処理を普通に実行した場合をみてみます。

 

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億です。

 

499950000000
4.97727632522583秒かかりました

 

5秒程度かかりました。

 

並列化する

 

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の返り値はリストです。

 

[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の処理に時間がかかっている場合は試してみてはいかがでしょうか。

 

おわり。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog