複数のコアにわたって Python で CPU を集中的に使用するプログラムを実行したいと考えており、これを行うための C 拡張機能を作成する方法を見つけようとしています。これに関するコード サンプルやチュートリアルはありますか?
5 に答える
Python プログラムを複数のプロセスに分割することは既に可能です。OS はすでにすべてのコアにプロセスを割り当てています。
これを行う。
python part1.py | python part2.py | python part3.py | ... etc.
OS は、パーツが可能な限り多くのリソースを使用することを保証します。cPickle
onsys.stdin
とを使用して、このパイプラインに沿って簡単に情報を渡すことができますsys.stdout
。
あまり多くの作業を行わなくても、これにより劇的な速度向上につながることがよくあります。
はい - 嫌悪感を持って - アルゴリズムを構築することは可能であり、それほど高速化されない可能性があります。ただし、これにより、最小限の作業で大きなメリットが得られることがよくあります。
と。
この目的のための再構築は、スレッドの並行性を最大化するために必要な再構築と完全に一致します。そう。より多くのデータを共有することが役立つことを証明できるまで、何も共有しないプロセスの並列処理から始めてから、より複雑なすべてを共有するスレッドの並列処理に移行します。
multiprocessingを見てください。データをグローバルに共有せず、スレッドの負荷を 1 つのプロセスに詰め込まないことがオペレーティング システムの優先事項であるという事実は、見過ごされがちです。
CPU を集中的に使用する動作にはスレッド化が必要であると主張する場合は、 C で GIL を操作するためのドキュメントを参照してください。それは非常に有益です。
これは、C 拡張の適切な使用方法です。検索するキーワードはPy_BEGIN_ALLOW_THREADS
.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
PS つまり、イメージング処理のように、処理が既に C で行われている場合は、C 拡張機能でロックを解除するのが適切です。処理コードが主に Python である場合は、他の人の提案multiprocessing
が優れています。通常、バックグラウンド処理のためにコードを C で書き直すことは正当化されません。
mpi4pyのような python mpi ライブラリの 1 つを使用することを検討しましたか? MPI は通常、クラスタ全体に作業を分散するために使用されますが、単一のマルチコア マシン上では非常にうまく機能します。欠点は、MPI の通信呼び出しを使用するためにコードをリファクタリングする必要があることです (これは簡単かもしれません)。
マルチプロセッシングは簡単です。それが十分に速くない場合、あなたの質問は複雑です。