168

私はPyPyを見ていましたが、なぜそれがメインラインの Python ディストリビューションに採用されていないのか疑問に思っていました。JIT コンパイルやメモリ フットプリントの削減などによって、すべての Python コードの速度が大幅に向上するのではないでしょうか?

要するに、PyPy が別のプロジェクトのままである主な欠点は何ですか?

4

6 に答える 6

253

PyPy は CPython のフォークではないため、CPython に直接マージすることはできません。

理論的には、Python コミュニティは PyPy を広く採用し、PyPy をリファレンス実装にすることができ、CPython を廃止することができます。ただし、PyPy には独自の弱点があります。

  • CPython は、C で書かれた Python モジュールと簡単に統合できます。これは、伝統的に Python アプリケーションが CPU 集中型のタスクを処理する方法です (たとえば、SciPy プロジェクトを参照してください)。
  • PyPy JIT コンパイル ステップ自体が CPU 時間を消費します。コンパイルされたコードを繰り返し実行することによってのみ、全体的に高速になります。これは、起動時間が長くなる可能性があることを意味するため、PyPy は必ずしもグルー コードや簡単なスクリプトを実行するのに効率的ではありません。
  • PyPy と CPython の動作は、すべての点で同一ではありません。特に「実装の詳細」(言語で指定されていないが、実用レベルでは依然として重要な動作) に関しては同じではありません。
  • CPython は PyPy よりも多くのアーキテクチャで実行され、PyPy では非現実的な方法で組み込みアーキテクチャでの実行にうまく適合しています。
  • メモリ管理のための CPython の参照カウント スキームは、PyPy のさまざまな GC システムよりもパフォーマンスへの影響が予測しやすいことは間違いありませんが、これは必ずしもすべての「純粋な GC」戦略に当てはまるわけではありません。
  • PyPy はまだ Python 3.x を完全にはサポートしていませんが、これはアクティブな作業項目です。

PyPy は素晴らしいプロジェクトですが、CPU を集中的に使用するタスクの実行速度がすべてではありません。多くのアプリケーションでは、これは多くの懸念事項の中で最小のものです。たとえば、Django は PyPy で実行できるため、テンプレート作成が高速になりますが、CPython のデータベース ドライバーは PyPy よりも高速です。最終的に、どの実装がより効率的かは、特定のアプリケーションのボトルネックがどこにあるかによって異なります。

別の例: PyPy はゲームに最適だと思うかもしれませんが、PyPy で使用されるようなほとんどの GC 戦略では、顕著なジッターが発生します。CPython の場合、CPU を集中的に使用するゲームのほとんどは PyGame ライブラリにオフロードされますが、PyGame は主に C 拡張として実装されているため、PyPy はこれを利用できません (ただし、pygame-cffi を参照してください)。PyPy はゲームの優れたプラットフォームになり得ると今でも思いますが、実際に使用されているのを見たことはありません。

PyPy と CPython は、基本的な設計上の問題に対するアプローチが根本的に異なり、トレードオフも異なります。そのため、あらゆる場合にどちらが「優れている」ということはありません。

于 2012-10-12T21:35:10.543 に答える
63

1 つは、 Python 2.x と100% の互換性があるわけではなく、3.x の予備的なサポートしかないことです。

また、マージできるものでもありません - PyPy によって提供される Python 実装は、彼らが作成したフレームワークを使用して生成されます。これは非常にクールですが、既存の CPython 実装とは完全に異なります。それは完全な交換でなければなりません。

PyPy と CPython には非常に具体的な違いがいくつかあります。大きな違いは、拡張モジュールのサポート方法です。標準ライブラリを超えたい場合、これは大きな問題です。

また、PyPy が普遍的に高速であるとは限らないことにも注意してください。

于 2012-10-12T21:22:43.330 に答える
56

Guido van Rossum によるこのビデオを参照してください。彼は、あなたが 12 分 33 秒で尋ねたのと同じ質問について話しています。

ハイライト:

  • Python 3 との互換性の欠如
  • 拡張サポートの欠如
  • グルーコードとして不適切
  • スピードがすべてではない

やっぱり彼が決める…

于 2012-10-12T21:28:04.690 に答える
15

理由の 1 つは、PyPyサイトによると、現在 32 ビットおよび 64 ビットの Intel x86 アーキテクチャでのみ実行され、CPython は他のプラットフォームでも実行されるためです。これはおそらく、PyPy のプラットフォーム固有の速度向上によるものです。スピードは良いことですが、多くの人は言語の実装をできるだけ「プラットフォームに依存しない」ものにしたいと考えています。

于 2012-10-12T21:27:27.057 に答える
7

詳細については、 David Beazleyによる基調講演をご覧になることをお勧めします。PyPy の性質と複雑さを明確にすることで、あなたの質問に答えます。

于 2012-10-13T17:52:09.457 に答える
6

ここで述べたことすべてに加えて、バグに関しては、PyPy は CPython ほど堅実ではありません。SymPy では、リリースされたバージョンとナイトリーの両方で、過去 2 年間で PyPy に約 12 個のバグが見つかりました。

一方、CPython で見つかったバグは 1 つだけで、それはプレリリースでした。

さらに、Python 3 のサポートがないことも軽視しないでください。コアの Python コミュニティの誰も、もはや Python 2 に関心を持っていません。彼らは、Python 3 の 5 番目のメジャー リリースとなる Python 3.4 の次の大きなことに取り組んでいます。そのため、競争相手になる前に、追いつく必要があります。

誤解しないでください。PyPy は素晴らしいです。しかし、多くの非常に重要な点で CPython より優れているとは言えません。

ちなみに、PyPy で SymPy を使用しても、メモリ フットプリントが小さくなることはありません (スピードアップもありません)。https://bitbucket.org/pypy/pypy/issues/1447/を参照してください。

于 2013-05-14T06:41:25.623 に答える