Python での並列 for ループ
-
Python で
multiprocessing
モジュールを使用してfor
ループを並列化する -
Python で
joblib
モジュールを使用してfor
ループを並列化する -
Python で
asyncio
モジュールを使用してfor
ループを並列化する
ループを並列化するということは、複数のコアを使用してすべてのプロセスを並列に分散させることを意味します。多数のジョブがある場合、各計算は、並列処理の前のジョブが完了するのを待ちません。代わりに、完了に別のプロセッサを使用します。
この記事では、Python の for
ループを並列化します。
Python で multiprocessing
モジュールを使用して for
ループを並列化する
ループを並列化するために、Python の multiprocessing
パッケージを使用できます。これは、別の進行中のプロセスの要求による子プロセスの作成をサポートしているためです。
for
ループの代わりに multiprocessing
モジュールを使用して、イテラブルのすべての要素に対して操作を実行できます。multiprocessing.pool()
オブジェクトを使用できます。Python で複数のスレッドを使用すると、グローバルインタープリターロックが原因でより良い結果が得られないためです。
例えば、
import multiprocessing
def sumall(value):
return sum(range(1, value + 1))
pool_obj = multiprocessing.Pool()
answer = pool_obj.map(sumall, range(0, 5))
print(answer)
出力:
0, 1, 3, 6, 10
Python で joblib
モジュールを使用して for
ループを並列化する
joblib
モジュールは、マルチプロセッシングを使用して複数の CPU コアを実行し、for
ループの並列化を実行します。パターンを記憶する軽量のパイプラインを提供し、簡単で簡単な並列計算を実現します。
並列処理を実行するには、ジョブの数を設定する必要があります。ジョブの数は、CPU 内のコアの数、または現在使用可能またはアイドル状態のコアの数に制限されます。
delayed()
関数を使用すると、しばらくしてから特定のメソッドを呼び出すように Python に指示できます。
Parallel()
関数は、指定されたコア(この場合は 2)で並列インスタンスを作成します。
コードを実行するためのリストを作成する必要があります。次に、リストが並列に渡されます。並列は 2つのスレッドを開発し、タスクリストをそれらに配布します。
以下のコードを参照してください。
from joblib import Parallel, delayed
import math
def sqrt_func(i, j):
time.sleep(1)
return math.sqrt(i ** j)
Parallel(n_jobs=2)(delayed(sqrt_func)(i, j) for i in range(5) for j in range(2))
出力:
[1.0,
0.0,
1.0,
1.0,
1.0,
1.4142135623730951,
1.0,
1.7320508075688772,
1.0,
2.0]
Python で asyncio
モジュールを使用して for
ループを並列化する
asyncio
モジュールはシングルスレッドであり、yield from
または await
メソッドを使用してコルーチンを一時的に中断することでイベントループを実行します。
以下のコードは、呼び出されているときに、待機するメイン関数に影響を与えることなく並行して実行されます。ループも main 関数と並行して実行されます。
import asyncio
import time
def background(f):
def wrapped(*args, **kwargs):
return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)
return wrapped
@background
def your_function(argument):
time.sleep(2)
print("function finished for " + str(argument))
for i in range(10):
your_function(i)
print("loop finished")
出力:
ended execution for 4
ended execution for 8
ended execution for 0
ended execution for 3
ended execution for 6
ended execution for 2
ended execution for 5
ended execution for 7
ended execution for 9
ended execution for 1