1

ループ内で何回も (数百万回以上) 呼び出す計算関数を持つモンテカルロ シミュレータがあります。これを高速化するために、シミュレーターへの複数の並列スレッド呼び出しに分割したいと思います。すなわち。合計 100 万回実行したい場合は、おそらく 4 ~ 250,000 回の実行に分割して、すべて並行して実行します。各スレッドが同じ変数名を使用している場合、衝突がないようにこれを処理するにはどうすればよいですか? 異なる名前の変数を使用して、シミュレーターの 4 つの個別のバージョンを作成する必要がありますか?

Python スレッド モジュールを使用したバージョンの作成を開始しましたが、変数に関する問題がまだあることは確かです。

助言がありますか?

御時間ありがとうございます。

カイル

4

1 に答える 1

2

コードが純粋な Python であり、CPython を使用している場合、グローバル インタープリター ロックが原因で、スレッド化によってコードが高速化されない可能性があります。おそらく探しているのはmultiprocessingモジュール、特にそのPool.map()メソッドです。

usingmulitprocessingは、個別のスレッドではなく個別のプロセスを使用することを意味するため、ロックなどの問題ははるかに少なくなります。

とはいえ、NumPy を使用してコードをベクトル化するか、C や Cython などの効率的なコンパイル済み言語で内部ループを記述すると、4 つのコアに並列化するよりもはるかに高速になる可能性があります。

于 2011-10-24T13:16:48.247 に答える