Python には GIL に関するいくつかの問題があるため、Java はマルチプロセッシング アプリケーションの開発に適しています。Python よりも Java の方が処理が効率的であることの正確な理由を説明していただけますか?
2 に答える
CPythonでのマルチスレッドの最大の問題は、グローバルインタープリターロック(GIL)です(他のPython実装は必ずしもこの問題を共有しないことに注意してください!)
GILは、 Pythonでの個別のスレッドの並列(同時)実行を効果的に防止する実装の詳細です。問題は、Pythonバイトコードを実行する場合は常に、現在のスレッドがGILを取得している必要があり、常に1つのスレッドのみがGILを持つことができるということです。
したがって、5つのスレッドがPythonバイトコードを実行しようとすると、GILが使用可能になるまで各スレッドが待機する必要があるため、効果的にインターリーブで実行されます。物理的な制約には同じ効果があるため、これは通常、シングルコアコンピューターでは問題になりません。一度に実行できるスレッドは1つだけです。
ただし、マルチコア/ SMPコンピューターでは、これがボトルネックになります。最近では、事実上すべてのスマートフォンや多くの組み込みシステムを含め、ほとんどすべてが複数のコアで実行されています。
Javaにはそのような制限がないため、複数のスレッドをまったく同時に実行できます。
マルチプロセッシング アプリケーションに関しては、Python が Java よりも優れているとは言えません。
まず、私が知る限り、OPは「より高速なコード実行」を意味するために「より良い」を使用していると想定しています。
私はおそらく C/ASM のバックグラウンドを持っているため、「スピードフリーク」症候群に苦しんでいるので、「Python は遅いですか?」という問題の根底に到達するのにかなりの時間を費やしました。問題。
それに対する簡単な答えは?"かもね。" ここにいくつかの重要な点があります:
1) マルチスレッド アプリケーションでは、Python は、GIL に似たものを持たない言語に対して不利になります。GIL は CPython の Python VM のアーティファクトであり、Python 言語自体ではありません。Jython、IronPython などの一部の Python VM には GIL がありません。
2) マルチプロセス アプリケーションでは、GIL は実際には適用されません。そのため、GIL によってほとんど邪魔されない Python コードのより高速な実行を利用し始めることができます。速度と同時実行性の両方を必要とする大規模な Python コードを作成する場合は、マルチプロセッシングと、場合によってはメッセージ パッシングのための ZMQ/0MQ について学ぶことを強くお勧めします。
3) GIL に関係なく、Java は多くの領域で Python よりも高速なコード実行を示します。これは、Python がメモリ内のオブジェクトを処理する方法がネイティブに異なるためです。
多くの Python 関数は、オブジェクトを変更するのではなく、メモリ内にオブジェクトのコピーを作成します (例については、 http://www.skymind.com/~ocrow/python_string/を参照してください) 。
Python は Dict を使用して、オブジェクトなどの属性を保存します。これらの領域に注意をそらしたり掘り下げたりしたくはありませんが、Python が実行できる「きちんとした」ことのいくつかは、速度が犠牲になると一般的に言えます。また、速度のペナルティが高すぎる場合、デフォルトの動作を回避する方法があることを知っておくことも重要です。
4) 私が知る限り、Java の速度の利点の一部は、Java VM が Python よりも最適化されているためです。舞台裏で行われるメモリ/オブジェクト作業の量の違いをなくすと、Java は依然として Python に勝ることがよくあります。Java が Python よりも注目されたからでしょうか? 確かではありませんが、十分な資金があれば、CPython の方が高速になる可能性があると思います。
- これらの問題の詳細については、http://c2.com/cgi/wiki?PythonProblemsを参照してください。
私は、新しいコードで Python をほぼ 100% 採用することを決定したと言えます。
時期尚早の最適化の罠に陥らないように注意してください。C コードはピンチのときにいつでも呼び出せることを忘れないでください。コードを適切に機能させ、保守しやすくしてから、アプリケーションの速度がニーズに合わない場合に最適化を開始します。
興味深いベンチマーク:
http://benchmarksgame.alioth.debian.org/u64/python.php
Python の速度の問題に関する詳細は、次の場所にあります。
http://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715