Python での並列 for ループ

Shivam Arora 2023年1月30日
  1. Python で multiprocessing モジュールを使用して for ループを並列化する
  2. Python で joblib モジュールを使用して for ループを並列化する
  3. Python で asyncio モジュールを使用して for ループを並列化する
Python での並列 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

関連記事 - Python Loop