これはおそらく些細な質問ですが、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
内部でモジュールを使用するため、最初のバージョンと同じように動作します。