2

Python にはグローバル ロックがあることを知っており、Glyph のpython multithreadingの説明を読みました。しかし、私はまだ試してみたいと思っています。簡単な (概念的に) タスクとして、画像の水平方向と垂直方向のエッジ検出を行うことにしました。

これが起こっていることです(疑似コード):

for pixels in picture:
    apply sobel operator horizontal
for pixels in picture:
    apply sobel operator vertical

ソーベルオペレーターの情報

これら 2 つのループは、互いに完全に独立して実行できるため、マルチスレッドの第一候補となります。(非常に大きな画像でこれら 2 つのループを実行すると、10 秒以上かかる場合があります)。ただし、Python でモジュールを使用しようとするthreadingと、グローバル ロックのために 2 倍の時間がかかります。私の質問は、Python の 2 つのスレッドでこれを行うというすべての希望を捨てて、別の言語で試してみるべきですか? 先に進むことができる場合、どのモジュールを使用すればよいですか? そうでない場合、どの言語で実験する必要がありますか?

4

5 に答える 5

7

Python 2.6 には、mulitprocessingモジュール (以前のバージョンの Python の以前の処理モジュール) が含まれるようになりました。

これは本質的にthreadingモジュールと同じインターフェースを持っていますが、スレッドではなく別のプロセスで実行を開始します。これにより、Python は複数のコア/CPU を活用し、スレッド化モジュール アプローチと比較して、CPU を集中的に使用するタスクに対して適切にスケーリングできます。

于 2009-02-11T04:10:34.207 に答える
3

sobel オペレーターが CPU バウンドである場合、Python は複数のコアを利用しないため、複数のスレッドからメリットを得ることはできません。

おそらく、複数のプロセスをスピンオフすることもできますが、それが単一の画像で作業するのに実用的かどうかはわかりません.

10 秒を無駄にする時間はあまりないように思えます。多数の画像を処理するために時間が気になる場合は、複数のプロセスを実行し、各プロセスで画像の個別のサブセットを処理する方が簡単な場合があります。

于 2009-02-11T03:50:21.260 に答える
2

NumPy も使用することをお勧めします。おそらく高速になるだけでなく、スレッドを使用すると、グローバルロックが発生しなくなります。

Jay が示唆するように、マルチプロセッシングを使用することもお勧めします。

とにかく、本当にスレッド化を練習したいのであれば、C で PThreads を試してみることをお勧めします。

于 2009-02-11T07:50:58.187 に答える
0

Python で並列プログラミングを練習したい場合は、Python マルチプロセッシングが正しい選択です。Python 2.6 がない場合 (たとえば、Ubuntu を使用している場合はありません)、マルチプロセッシングのGoogle コード バックポートバージョンを使用できます。これは PyPI の一部であるため、EasyInstall (Ubuntu の python-setuptools パッケージの一部) を使用して簡単にインストールできます。

于 2009-02-13T13:18:03.107 に答える
0

Sobel 演算子のようなバルク行列演算は、Matlab/Octaveを (正しく) 使用することで、大幅な速度向上を確実に実現します。NumPyが行列/配列演算に対して同様の高速化を提供する可能性があります。

于 2009-02-11T04:24:28.120 に答える