Joblibを使用してPythonコードを並列に実行
4394 ワード
微信公衆番号:測定空間
ほとんどの問題では、並列計算は計算速度を向上させることができます.PCの計算能力が向上するにつれて,PCでパラレルコードを実行することで計算速度を簡単に向上させることができる.Joblibは、Pythonコードを単純にパラレルコンピューティングモードに変換できるパッケージで、私たちのプログラムを非常に単純にパラレル化し、コンピューティング速度を向上させることができます.
JoblibはPythonで軽量レベルのパイプラインを提供するためのツールのセットです.次の機能があります.透明なディスクキャッシュ機能と「怠惰」実行モード、簡単な並列計算 Joblibはnumpy大型配列を特定の最適化し,簡単で,迅速であった.
以下では,Joblibを用いて並列計算を実現する方法を簡単な例を用いて説明する.単一パラメータ
ここでは、全反復回数を10に設定.
Joblibの
こんなに簡単です!もし私たちの関数に複数のパラメータがあったらどうしますか?簡単です.2つのパラメータを使用して、新しい関数
並列計算機能に加えて、Joblibには次の機能があります.高速ディスクキャッシュ:Python関数のmemoizeまたはmake-like機能.大型numpy配列を含む任意のPythonオブジェクトに適用されます. 高速圧縮:pickleの代わりにjoblibを使用する.dumpとjoblib.loadはビッグデータの読み取りと記憶効率を向上させることができる.
詳細については、Joblibの公式サイトを参照してください.
転載先:https://juejin.im/post/5cd24136518825408b33e5dc
ほとんどの問題では、並列計算は計算速度を向上させることができます.PCの計算能力が向上するにつれて,PCでパラレルコードを実行することで計算速度を簡単に向上させることができる.Joblibは、Pythonコードを単純にパラレルコンピューティングモードに変換できるパッケージで、私たちのプログラムを非常に単純にパラレル化し、コンピューティング速度を向上させることができます.
JoblibはPythonで軽量レベルのパイプラインを提供するためのツールのセットです.次の機能があります.
以下では,Joblibを用いて並列計算を実現する方法を簡単な例を用いて説明する.単一パラメータ
i
を用いて簡単な関数my_fun()
を定義した.この関数は1秒待機し、i**2
の平方根、すなわちi
自体を返します.from joblib import Parallel, delayed
import time, math
def my_fun(i):
""" We define a simple function here.
"""
time.sleep(1)
return math.sqrt(i**2)
ここでは、全反復回数を10に設定.
time.time()
関数を使用して、my_fun()
の実行時間を計算します.簡単なforサイクルを使用すると、計算時間は約10秒です.num = 10
start = time.time()
for i in range(num):
my_fun(i)
end = time.time()
print('{:.4f} s'.format(end-start))
10.0387 s
Joblibの
Parallel
およびdelayed
関数を使用して、my_fun()
関数の並列動作を簡単に構成できます.ここではいくつかのパラメータを使用します.n_jobs
はパラレルジョブの数です.ここでは2
に設定します.i
はmy_fun()
関数の入力パラメータであり、依然として10反復である.2つのパラレルタスクは、forサイクルの実行時間の約半分を節約し、結果としてパラレルに約5秒かかります.start = time.time()
# n_jobs is the number of parallel jobs
Parallel(n_jobs=2)(delayed(my_fun)(i) for i in range(num))
end = time.time()
print('{:.4f} s'.format(end-start))
5.6560 s
こんなに簡単です!もし私たちの関数に複数のパラメータがあったらどうしますか?簡単です.2つのパラメータを使用して、新しい関数
my_fun_2p(i,j)
を定義します.def my_fun_2p(i, j):
""" We define a simple function with two parameters.
"""
time.sleep(1)
return math.sqrt(i**j)
j_num = 3
num = 10
start = time.time()
for i in range(num):
for j in range(j_num):
my_fun_2p(i, j)
end = time.time()
print('{:.4f} s'.format(end-start))
30.0778 s
start = time.time()
# n_jobs is the number of parallel jobs
Parallel(n_jobs=2)(delayed(my_fun_2p)(i, j) for i in range(num) for j in range(j_num))
end = time.time()
print('{:.4f} s'.format(end-start))
15.0622 s
並列計算機能に加えて、Joblibには次の機能があります.
詳細については、Joblibの公式サイトを参照してください.
転載先:https://juejin.im/post/5cd24136518825408b33e5dc