web-dev-qa-db-ja.com

PyPy-どのようにしてCPythonを打ち負かすことができますか?

Google Open Source Blog から:

PyPyは、PythonでPythonを再実装したもので、CPythonよりも優れたパフォーマンスを達成するために高度な技術を使用しています。長年の努力がついに報われました。私たちの速度の結果は、わずかに遅いことから、実際のアプリケーションコードで最大2倍、小さなベンチマークで最大10倍まで、CPythonを上回ることがあります。

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

(関連するメモについて...なぜ誰もがこのようなことをしようとするのですか?)

256
Agnel Kurian

Q1。これはどのように可能ですか?

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

CPythonインタープリターの実装の制限は、PyPyが実行できる特定の最適化(たとえば、きめの細かいロック)を妨げます。

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

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

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

Q3。そして、PyPyPyまたはPyPyPyPyがスコアを破る可能性は何ですか?

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

更新:最近、 慎重に作成された例 で、PyPyはgcc -O3でコンパイルされた同様のCプログラムよりも優れていました。これは不自然なケースですが、いくつかのアイデアを示しています。

Q4。なぜ誰もがこのようなことをしようとするのですか?

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

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

  • 生産のための共通の翻訳およびサポートフレームワーク
    動的言語の実装、クリーンな言語の強調
    言語仕様と実装の分離
    側面。これをRPython toolchain_と呼びます。

  • 上記のツールチェーンを使用して、低レベルの詳細をエンコードせずに新しい高度な高レベル機能を有効にするPython_言語の準拠、柔軟かつ高速な実装。

このように懸念を分離することにより、Python-および他の動的言語の実装は、任意の動的言語用のジャストインタイムコンパイラを自動的に生成できます。また、ターゲットプラットフォーム、メモリモデル、スレッドモデル、ガベージコレクション戦略、適用される最適化など、歴史的にユーザーの制御外にあった多くのものを含む、実装の決定に対するミックスアンドマッチアプローチを可能にします。そもそもJIT。

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

154
Noufal Ibrahim

「PyPyはPythonのPythonでの再実装です」とPyPy、IMHOを説明するのはやや誤解を招く方法ですが、技術的には正しいです。

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

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

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

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

インタープリターは、R​​Pythonで書かれた通常のPythonインタープリターです。

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

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

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


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

したがって、PyPyプロジェクトの真の利点は、動的言語用の効率的なプラットフォームに依存しないインタープリターを実装するすべての部分を(可能な限り)分離することです。そして、それらを1か所で適切に実装し、多くのインタープリターで再利用できます。 「私のPythonプログラムの実行速度が速くなった」というような即時の勝ちではありませんが、将来の大きな見通しです。

また、Pythonプログラムをより高速に実行できます(おそらく)。

285
Ben

PyPyはPythonで実装されていますが、JITコンパイラを実装して、ネイティブコードをその場で生成します。

Pythonの上にPyPyを実装する理由は、おそらくJITコンパイラーがホスト言語のパフォーマンスをいくぶん無関係にするため、非常に生産的な言語であるためでしょう。

23
Marcelo Cantos

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

あなたの質問は、コードの実行中にPyPyインタープリターがCPythonの上で実行されていることを期待しているようです。 編集:はい、PyPyを使用するには、まずPyPy pythonコードをCに変換し、gccでビルドしてjvmバイトに変換しますコード、または.Net CLIコード。 はじめに を参照してください

11
bobpaul