質問

から Google オープンソース ブログ:

Pypyは、PythonのPythonの再実装であり、高度な技術を使用してCpythonよりも優れたパフォーマンスを達成しようとします。長年の努力 ついに報われました。私たちのスピード 結果はしばしばCPythonを打ち負かし、 少し遅くなったり、 リアルで最大2倍のスピードアップ アプリケーション・コード、最大 小さなベンチマークで10倍。

これはどのようにして可能でしょうか?PyPy の実装にはどの Python 実装が使用されましたか? CPython?そして、PyPyPy または PyPyPyPy がスコアを上回る可能性はどれくらいでしょうか?

(関連したメモですが...なぜ誰もこのようなことを試みるのですか?)

役に立ちましたか?

解決

Q1.これはどのようにして可能でしょうか?

手動メモリ管理 (これは CPython がカウントを行う際に行うことです) は、場合によっては自動管理よりも遅くなる可能性があります。

CPython インタープリターの実装には制限があるため、PyPy で実行できる特定の最適化ができなくなります。きめの細かいロック)。

マルセロが言ったように、JIT。オブジェクトの型をその場で確認できるため、最終的に呼び出したいメソッドに到達するまでに複数のポインター逆参照を行う必要がなくなります。

Q2.PyPy の実装にはどの Python 実装が使用されましたか?

PyPy インタープリターは、Python (CPython インタープリターではなく言語) の静的に型指定されたサブセットである RPython で実装されます。- 参照する https://pypy.readthedocs.org/en/latest/architecture.html 詳細については。

Q3.そして、PyPyPy または PyPyPyPy がスコアを上回る可能性はどれくらいでしょうか?

それは、これらの仮説インタプリタの実装に依存します。たとえば、そのうちの 1 つがソースを取得し、それに対して何らかの分析を実行し、しばらく実行した後にターゲット固有の厳密なアセンブリ コードに直接変換した場合、CPython よりもかなり高速になると思います。

アップデート: 最近、ある 丁寧に作られた例, PyPy は、次のコマンドでコンパイルされた同様の C プログラムよりも優れたパフォーマンスを発揮しました。 gcc -O3. 。これは不自然なケースですが、いくつかのアイデアを示しています。

Q4.なぜこのようなことを試みようとするのでしょうか?

公式サイトより。 https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

私たちは以下を提供することを目指しています。

  • 制作のための共通の翻訳およびサポート フレームワーク
    動的言語の実装、クリーンさを強調
    言語仕様と実装の分離
    側面。これを私たちはこう呼んでいます RPython toolchain_.

  • Python_のコンプライアンス、柔軟性、迅速な実装 上記のツールチェーンを使用して新しい高度な 低レベルをエンコードせずに高レベルの機能を実現 細部。

このように関心を分離することで、Pythonの実装は - その他の動的言語 - 自動的に 任意の動的言語用のジャストインタイムコンパイラ。また、 実装の決定に対するミックス・アンド・マッチ・アプローチ (多数を含む) これまでユーザーの制御の及ばないものであったもの ( ターゲット プラットフォーム、メモリおよびスレッド モデル、ガベージ コレクション 戦略、および適用された最適化 ( そもそもJITを持っている。

C コンパイラー gcc は C で実装され、Haskell コンパイラー GHC は Haskell で書かれています。Python インタプリタ/コンパイラを Python で書かない理由はありますか?

他のヒント

「PyPy は Python で Python を再実装したものです」というのは、技術的には正しいのですが、個人的には PyPy を説明するかなり誤解を招きやすい言い方です。

PyPy には 2 つの主要な部分があります。

  1. 翻訳フレームワーク
  2. 通訳

翻訳フレームワークはコンパイラです。コンパイルします RPython コードを C (または他のターゲット) に落とし込み、ガベージ コレクションや JIT コンパイラなどの機能を自動的に追加します。それ できない 任意の Python コードを処理します (RPython のみ)。

RPython は通常の Python のサブセットです。すべての RPython コードは Python コードですが、その逆はありません。RPython には正式な定義はありません。RPython は基本的に「PyPy の翻訳フレームワークによって翻訳できる Python のサブセット」にすぎないからです。ただし、RPython コードを翻訳するには、次のようにする必要があります。 静的に型付けされた (型は推論され、宣言はしませんが、厳密には変数ごとに 1 つの型です)、実行時に関数/クラスを宣言/変更することもできません。

この場合、インタープリターは RPython で書かれた通常の Python インタープリターになります。

RPython コードは通常の Python コードであるため、任意の Python インタープリターで実行できます。しかし、PyPy の速度に関する主張は、その方法で実行することによってもたらされるものではありません。インタプリタの翻訳には時間がかかるため、これは単に迅速なテスト サイクルのためのものです。 長さ 時間。

それを理解すれば、PyPyPy や PyPyPyPy に関する推測が実際には意味をなさないことがすぐに明らかになるはずです。RPython で書かれたインタープリターがあります。これを、Python を迅速に実行する C コードに変換します。そこでプロセスは停止します。RPython を再処理して高速化する必要はもうありません。

したがって、「PyPy が CPython よりも高速であることがどのようにして可能なのか」もかなり明らかになります。PyPy は、JIT コンパイラを含む、より優れた実装を備えています (一般に、JIT コンパイラなしではそれほど高速ではないと思います。つまり、PyPy は、JIT コンパイラの影響を受けやすいプログラムでのみ高速であることを意味します)。CPython は、Python 言語の高度に最適化された実装になるように設計されたことはありません (ただし、CPython はそれを高度に最適化するように努めています) 最適化された 違いに従って実装してください)。


PyPy プロジェクトの本当に革新的な点は、高度な GC スキームや JIT コンパイラを手作業で書かないことです。彼らは RPython で比較的簡単にインタプリタを作成します。そして、すべての点で RPython は Python よりも低レベルですが、依然としてオブジェクト指向のガベージ コレクション言語であり、C よりもはるかに高レベルです。次に、翻訳フレームワーク 自動的に GC や JIT などを追加します。したがって、翻訳フレームワークは 巨大な これは PyPy Python インタプリタにも同様に当てはまりますが、実装が変更されても、より自由に実験してパフォーマンスを向上させることができます (GC バグの導入や変更に対応するための JIT コンパイラの更新を心配する必要はありません)。また、Python3 インタープリターの実装に着手すると、同じ利点が自動的に得られることも意味します。そして、PyPy フレームワークで書かれたその他のインタプリタ (洗練のさまざまな段階にあるインタプリタが多数あります)。また、PyPy フレームワークを使用するすべてのインタープリターは、フレームワークによってサポートされるすべてのプラットフォームを自動的にサポートします。

したがって、PyPy プロジェクトの真の利点は、動的言語用の効率的なプラットフォームに依存しないインタープリターの実装のすべての部分を (可能な限り) 分離することです。そして、それらを 1 か所にまとめた 1 つの優れた実装を考え出し、多くのインタプリタ間で再利用できます。これは、「Python プログラムの実行速度が向上した」というような、すぐに得られる成果ではありませんが、将来の大きな展望となります。

そして、Python プログラムをより速く実行できるようになります (おそらく)。

PyPyはPythonで実装され、それはオンザフライでネイティブコードを生成するために、JITコンパイラを実装している。

はPythonの上にPyPyを実装する理由は、JITコンパイラは、ホスト言語のパフォーマンスはやや無関係になり、特に以来、単に非常に生産的言語であるということはおそらくあります。

PyPyは制限はPythonで書かれています。それは私の知る限り、CPythonのインタプリタ上で実行されません。制限されたPythonはPython言語のサブセットです。それは、実行時にPythonインタプリタを利用しないインストール時に私の知る限り、PyPyインタープリターはそう、マシンコードにコンパイルされます。

あなたの質問は、コードの実行中にはCPythonの上で実行されているインタプリタPyPyを期待しているようです。 編集をはい、あなたが最初のGCCとCとのビルドには、JVMバイトコードへの、または.NET CLIのコードのいずれか、PyPyのPythonコードを翻訳PyPyを使用します。 スタートする

を参照してください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top