2016-05-21 4 views
0

Iにリストを持って、Lと大辞典、kはKの特定のキーであるKDキーを含むと読み取り専用辞書にアクセスします。 D [k]には、結果のリストを決定するために必要な情報が含まれています。今私はKの各値を調べています。私に値する情報があれば、kをLに追加します。これは反復的な方法で動作しますが、私はマルチスレッドでスピードアップできることを願っています。辞書の更新はありません。これを実装するための良い方法は何でしょうか?複数のスレッド

+0

を使用することです。 –

+0

@PeterWoodなぜですか? – ZWiki

答えて

2

は、一般的な考え方は、MapReduceまたはProducer-Consumerパターンでありますキーの1/4と辞書への参照を取得します)。

Reduce/Consumer: プロセスがヒットしたことを検出すると、その値をスレッドセーフキューに送信します。

すべてのプロセスが正常に終了すると、キューに結果が保持されます。

ほぼ確実にあなたが見つける最も労働無料の方法は、マルチスレッドは、物事をスピードアップしませんmultiprocessing.Pool.map機能(docs

+1

[MapReduceをPythonで実装する]素晴らしい記事(https://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/) –

4

あなたが使用しているPythonインタプリタと、辞書を検索する際に使用している方法によっては、マルチスレッド化はおそらく高速化しません。 cpythonのGlobal Interpreter Lock (GIL)は、指定された時間に1つのスレッドしかPythonコードを実行できないことを意味します。

Cで書かれたパフォーマンス用に最適化されたライブラリを使用している場合、数学的な重労働(NumPyはgood example)を実行している間にGILをリリースする可能性があります。同じことは、I/O上で待機しているスレッドにも当てはまります。それを超えると、スレッド化されたコンテキストの切り替えに伴うオーバーヘッドが発生するため、複数のスレッドで遅くなる可能性があります。

Pythonでは、通常、multi-processingを使用するとより良い結果が得られます。各プロセスには独自のGILがあり、コードは並列に実行できます。あなたの辞書は本当に読み込み専用であると仮定すると、生成された各プロセスに辞書のコピーを与えるのは簡単です。

マルチプロセッシングの欠点は、スレッド間の通信に伴うオーバーヘッドが増えることです。実行が分離されるほど、より良い結果が得られます。 Windowsには新しいプロセスが生成されるため、Windowsにはhigher cost associatedがある傾向にあることに注意してください。しかし、プロセスの数が非常に少ないため、CPUに制限された問題ではありません。

マップフェーズ/プロデューサー::。あなたが産卵したいプロセスの数(I、E、4つのプロセスについて、各プロセスによって探索空間を分割

関連する問題