5

PyPyを読みました - どうすれば CPython を打ち負かすことができますか? 他にも数え切れないほどのものがありますが、Pythonで書かれたものがPython自体よりも高速であることを理解できません。

私が考えることができる唯一の方法は、PyPy が何らかの方法で C をバイパスし、アセンブリ言語命令に直接コンパイルすることです。その場合は、それで問題ありません。

誰かが PyPy の仕組みを説明してくれませんか? 簡単な答えが必要です。

私は Python が大好きで、貢献を始めたいと思っています。PyPy は、私のコードをプルするかどうかに関係なく、開始するのに最適な場所のように見えます。しかし、私が行った簡単な調査からは理解できません。

4

4 に答える 4

14

PyPy を理解する最も簡単な方法は、それが Python で実装されていることを忘れることです。

とにかく、実際には RPython で実装されているわけではありません。RPython は Python インタープリターで実行できますが、Python コードはRPython コンパイラー (PyPy 変換フレームワーク) でコンパイルできません。RPython は Python のサブセットですが、「省略」されている部分は十分に実質的であるため、RPython でのプログラミングは Python での通常のプログラミングとは大きく異なります。

したがって、Python コードは RPython コードとして扱うことができず、慣用的な RPython プログラムの「ルック アンド フィール」は慣用的な Python プログラムとは大きく異なるため、これらの間の接続を完全に無視して、作成された例を考えてみましょう。

コンパイラを使って新しい言語 Frobble を開発したとします。また、Frobble で Python インタープリターを作成しました。私の「FrobblePython」インタープリターは、多くの場合、CPython インタープリターよりも大幅に高速であると主張しています。

これは奇妙または不可能だと思いますか? もちろん違います。新しい Python インタープリターは、CPython インタープリターよりも速くなったり遅くなったりする可能性があります (または、さまざまなマージンによって、ある部分では速く、別の部分では遅くなる可能性が高くなります)。高速かどうかは、FrobblePython の実装と、私の Frobble コンパイラでコンパイルされたコードのパフォーマンス特性に依存します。

PyPy インタープリターについては、まさにそのように考える必要があります。それを実装するために使用される言語である RPython がたまたま Python インタープリターによって解釈される可能性があるという事実 (RPython プログラムをコンパイルして実行するのと同じ外部結果を伴う) は、それがどれほど高速であるかを理解することとはまったく関係ありません。重要なのは、PyPy インタープリターの実装と、RPython コンパイラーによってコンパイルされたコードのパフォーマンス特性 (RPython コンパイラーがコンパイルするプログラムに特定の種類の JIT 機能を自動的に追加できるという事実など) だけです。

于 2012-09-30T02:36:08.030 に答える
7

「JITがあります」という答えは技術的には正しいですが、不十分です。Python インタープリターによって Python コードとして実行される PyPy は、解釈する Python コードを JIT コンパイルできます(実際、JIT テストはこの方法で実行されることがよくあります) が、それでも非常に低速です (解釈を開始するのに数分かかることがあります)。

JIT よりも前から存在し、実際には JIT に必要な欠けている部分は、Python の制限されたサブセット (RPython と呼ばれる) でインタープリターを作成し、それを C コードにコンパイルすることです。このようにして、おおよそ C の抽象化レベルで実行されるプログラムを取得します (より高い抽象化レベルで書かれているにもかかわらず)。このインタープリターは歴史的に見て、私の知る限り、CPythonよりもやや遅いですが、数桁遅くはありません(インタープリターのインタープリターのように)。

「アセンブリに直接コンパイル」に関するあなたのコメントは、混乱を招きます。アセンブリ コードは C コードよりも自動的に高速というわけではありません。実際、アセンブリ コードの生成で今日の C コンパイラを打ち負かすことは難しいでしょう。C コードは、移植性全体に触れなくても、記述および/または生成がはるかに簡単です。混乱。問題は Python を C やアセンブリに変換することではなく (Nuitka を見てください)、セマンティクスに影響を与えずにプログラムをより効率的な方法で言い換えることです。アセンブリに直行しても、それに関する難しい問題は解決されず、より効率的なプログラムのコードを生成するという比較的簡単な問題が難しくなり、C で表現できない最適化がほとんど許可されなくなります。

現在、PyPy の JIT はマシン コードを生成しますが、PyPy 実行可能ファイルは C コンパイラによって C コードからコンパイルされます。PyPy 開発者は、複数のプラットフォームは言うまでもなく、単一のプラットフォームでも既存の C コンパイラと競合しようとすると、ばかになります。幸いなことに、彼らは馬鹿ではなく、それを知っています。JIT にアセンブリ コードを生成させる理由は異なりますが、はるかに優れています (まず、JIT のコンテキストでは、C では実行できない最適化がいくつかあります)。

ちなみに、上で書いたことのほとんどは、リンク先の質問への回答にも記載されています。

于 2012-09-29T19:38:09.947 に答える
2

PyPy 自体は、Python の制限付きサブセットである RPython で記述されています。CPython の上で実行できますが、非常に遅いため、代わりにこの RPython を C に変換して、解釈をバイパスします。理論的には、これはすでに CPython よりも高速ですが、実際にはかなり遅くなります。その上に、Python をアセンブラーにコンパイルするジャスト イン タイム コンパイラ (RPython でも) が実装されています。

つまり、実行時の任意の時点で実際に二重解釈が行われることはないため、問題はありません。

于 2012-09-29T23:52:13.970 に答える
2

Pypy には JIT (Just In Time) コンパイルがあります。JIT コンパイルは、実行中に最適化を行うことができます (プリコンパイルされていないため)。

コードは最初から Assembly または C にコンパイルされません。解釈されたコードです (Pypy インタープリターで実行されます)。その後、インタープリターは「ジャストインタイム」でコンパイルを実行できます。

http://en.wikipedia.org/wiki/Just-in-time_compilation

http://en.wikipedia.org/wiki/Interpreted_language

于 2012-09-28T18:34:32.347 に答える