Pythonを使用していくつかのアルゴリズムを実行します。使用するPythonに関係なく、多くのバージョンを試しましたが、CPU使用率は最大25%になります。PythonがCPUリソースの残りを利用しないのはなぜですか?サービスの優先度を通常から高に変更し、その後再起動してリアルタイムに変更しましたが、何も変わりませんでした。
PythonにCPUの50%以上を使用させる方法はありますか?
Pythonを使用していくつかのアルゴリズムを実行します。使用するPythonに関係なく、多くのバージョンを試しましたが、CPU使用率は最大25%になります。PythonがCPUリソースの残りを利用しないのはなぜですか?サービスの優先度を通常から高に変更し、その後再起動してリアルタイムに変更しましたが、何も変わりませんでした。
PythonにCPUの50%以上を使用させる方法はありますか?
回答:
簡単に言うと、4つの論理コアを備えたシステムでシングルスレッドアプリケーションを実行しているため、1つのプロセスですべてのコアを使用しています。
CPUをより多く使用するには、アルゴリズムを書き直してマルチスレッドにするか、特定のコアで2つ以上のインスタンスを実行できるかどうかを確認する必要があります(これは簡単なことではありません)。他に方法はありません。
Python言語はマルチコアCPUよりも前のものであるため、マルチコアCPUをネイティブに使用しないのは奇妙なことではありません。
さらに、すべてのプログラムが複数のコアから利益を得られるわけではありません。次のステップが前のステップの結果に依存するステップで実行される計算は、より多くのコアを使用すると速くなりません。ベクトル化できる問題(同じ計算を大きなデータ配列に適用する)は、個々の計算が独立しているため、比較的簡単に複数のコアを使用できます。
あなたが多くの計算をしているとき、私はあなたがnumpyを使用していると仮定していますか?そうでない場合は、チェックしてください。ATLASのような最適化された線形代数ライブラリを使用できるCで記述された拡張機能です。標準のPythonと比較して、数値計算を大幅に高速化できます。
そうは言っても、Pythonで複数のコアを使用する方法はいくつかあります。
multiprocessing
モジュールです。このmultiprocessing.Pool
クラスは、複数のCPUにわたるベクトル化map()
と関連メソッドを提供します。ただし、ここにはトレードオフがあります。プロセス間で大量のデータを通信する必要がある場合、そのオーバーヘッドは複数のコアの利点を無効にする可能性があります。threading
この点に関して、モジュールはそれほど有用ではないことに注意してください。メモリ管理を簡単にするために、グローバルインタープリターロック(「GIL」)は、一度に1つのスレッドのみがPythonバイトコードを実行できるようにします。ただし、numpyなどの外部モジュールは、内部で複数のスレッドを使用できます。