単純な Python ループを並列化するにはどうすればいいですか? 質問する

単純な Python ループを並列化するにはどうすればいいですか? 質問する

これはおそらく些細な質問ですが、Python で次のループを並列化するにはどうすればよいでしょうか?

# setup output lists
output1 = list()
output2 = list()
output3 = list()

for j in range(0, 10):
    # calc individual parameter value
    parameter = j * offset
    # call the calculation
    out1, out2, out3 = calc_stuff(parameter = parameter)

    # put results into correct output list
    output1.append(out1)
    output2.append(out2)
    output3.append(out3)

Python で単一スレッドを開始する方法は知っていますが、結果を「収集」する方法がわかりません。

複数のプロセスでも問題ありません。この場合、最も簡単なものであれば何でもかまいません。現在は Linux を使用していますが、コードは Windows や Mac でも実行できるはずです。

このコードを並列化する最も簡単な方法は何ですか?

ベストアンサー1

CPython 実装には現在、グローバル インタープリタ ロック(GIL) があり、同じインタープリタのスレッドが Python コードを同時に実行することを防ぎます。つまり、CPython スレッドは同時 I/O バウンドのワークロードには役立ちますが、CPU バウンドのワークロードには通常役立ちません。名前からcalc_stuff()ワークロードが CPU バウンドであることがわかるので、ここでは複数のプロセスを使用する必要があります (GIL に関係なく、CPU バウンドのワークロードでは複数のプロセスの方が優れたソリューションになることがよくあります)。

Python 標準ライブラリにプロセス プールを作成する簡単な方法は 2 つあります。1 つ目はモジュールでmultiprocessing、次のように使用できます。

pool = multiprocessing.Pool(4)
out1, out2, out3 = zip(*pool.map(calc_stuff, range(0, 10 * offset, offset)))

multiprocessing実装方法により、これは対話型インタープリターでは機能しないことに注意してください。

プロセスプールを作成する2番目の方法はconcurrent.futures.ProcessPoolExecutor:

with concurrent.futures.ProcessPoolExecutor() as pool:
    out1, out2, out3 = zip(*pool.map(calc_stuff, range(0, 10 * offset, offset)))

これはmultiprocessing内部でモジュールを使用するため、最初のバージョンと同じように動作します。

おすすめ記事