PyPyが6.3倍高速である場合、CPythonではなくPyPyを使用すべきではないのはなぜですか?


684

PyPyプロジェクトについてはよく聞いています。彼らはそれが彼らのサイトのCPythonインタープリターより6.3倍速いと主張しています

Pythonのような動的言語について話すときはいつでも、速度が最大の問題の1つです。これを解決するために、彼らはPyPyが6.3倍速いと言います。

2つ目の問題は、悪名高いグローバルインタープリターロック(GIL)である並列処理です。このため、PyPyはGILのないPythonを提供できると述べています

PyPyがこれらの大きな課題を解決できるとしたら、PyPyの幅広い採用を妨げている弱点は何ですか?つまり、典型的なPython開発者である私のような誰かが、 PyPyに切り替えるのを妨げているのは何ですか?


30
コメントがパージされたのは、ほとんどが回答で具体化する必要がある(または場合によってはそうする必要がある)か、まったく言ってはならないことでした。また、この質問の主観性に関して提起されたいくつかの懸念に対処するために編集されました。事実を使用して回答してみてください。可能であれば、アサーションをソースでバックアップしてください!
Shog9 2013

3
私はPypyをよく使っています。それは非常にうまく機能する傾向があります。ただし、Pypyは多くのCPU負荷の高いワークロードではかなり高速ですが、実際にスローしたI / O負荷の高いワークロードでは速度が遅くなります。たとえば、バックシフトと呼ばれる重複排除バックアッププログラムを作成しました。大量のファイルのチャンクを行う最初のバックアップには、pypyが最適です。しかし、ほとんどがタイムスタンプを更新するだけの後続のバックアップでは、CPythonの方が高速です。
dstromberg 2014年

回答:


657

注: PyPyは、この質問が尋ねられたときの2013年よりも成熟しており、サポートが向上しています。古い情報から結論を引き出すことは避けてください。


  1. 他の人がすぐに言及したように、PyPy はCの拡張を微妙にサポートしています。それは持ってサポートをするが、通常より遅く、より-Pythonの速度であり、それは最高の状態であやふやです。したがって、多くのモジュールは単にCPythonを必要とします。PyPyはnumpyのサポートしていません PyPyは今numpyのをサポートしています。一部の拡張機能はまだサポートされていません(Pandas、SciPyなど)。変更を加える前に、サポートされているパッケージのリストを確認してください。
  2. 現在、Python 3のサポートは実験的です。 安定したばかりです!2014年6月20日の時点で、PyPy3 2.3.1-Fulcrumがリリースされました
  3. 多くの人がPythonを使用している「スクリプト」では、PyPy 実際には高速ではない場合があります。これらは、単純で小さなことを行う短期間のプログラムです。PyPyはJITコンパイラーであるため、その主な利点は実行時間が長いことと単純な型(数値など)にあります。率直に言って、PyPyのpre-JIT速度は CPythonに比べてかなり悪いです。
  4. 慣性。多くの場合、PyPyへの移行にはツールの変更が必要です。

これらが私に影響を与える主な理由だと思います。


14
あなたが改造について言及しているのは素晴らしいことです。たとえば、私のWebホストにはPython 2.4と2.5のどちらかを選択できます。そして、近くの「エンターテインメントソフトウェアの主要な生産者」は2.6を使用しており、すぐにアップグレードする予定はありません。場合によっては、コンバージョンの費用を見つけることさえも、多大で費用のかかる作業になることがあります。
Mike Housky 2013

19
PyPyが「Cと同じ速さ」であることは、数値に使用される高度に最適化されたマルチスレッドキャッシュ対応Cライブラリよりも汎用Cの方が重要です。数値の場合、Pythonは大きな配列へのポインターを移動するために使用されます。したがって、PyPyが「Cと同じ速さ」であることは、「ポインタとメタデータがCと同じ速さで移動する」ことを意味します。大したことではない。それなら、なぜPythonを気にする必要があるのでしょうか。cblasとlapackeの関数シグネチャを見てください。
cjordan1 2013

12
@ cjordan1:私はあなたの言っていることがわかりません。高レベルのnumpyコンストラクトはnp.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)Pythonで非常に表現力があり(?)、Pythonは科学コミュニティに非常に適しています。さらに、Pythonで非集中的な部分を実行し、より集中的なループのためにCにシェルアウトすることは、一般的で使用可能な戦略です。
Veedrac 2013

26
@Veedracそれは私が意味したことです。「cblasとlapackeの関数シグネチャを見てください」のように、それらは長くて使いにくいので、ポインタとメタデータをフェリー処理するためにPythonを使用する理由をすぐに理解できます。
cjordan1 2013

5
@ tommy.carstensenこれは本当に深く行くには良い場所ではありませんが、私はやってみます。1.私が書いたとき、これは今よりもずっと真実でした。2.「スクリプト」は多くの場合IOが重い。PyPyのIOは依然としてCPythonよりも遅いことがよくあります-以前は大幅に遅くなりました。3. PyPyは、文字列の処理においてCPythonよりも低速でした-今では、多くの場合より良く、めったに悪くはありません。4.多くの「スクリプト」は単なるグルーコードです-インタープリターを高速化しても、その場合の全体的なランタイムは改善されません。5. PyPyのウォームアップ時間は以前より長くなりました-実行時間の短いスクリプトは、多くのホットコードを生成することができませんでした。
Veedrac、2015

104

そのサイトはPyPyがCPythonより6.3倍速いと主張していませ。引用するには:

すべてのベンチマークの幾何平均はCPythonより0.16または6.3倍高速

これはとてもあなたが行った包括的ステートメント異なるステートメントであり、違いを理解すると、「PyPyを使用する」とだけは言えない理由の少なくとも1つのセットが理解できます。それは私が一律に選んだように聞こえるかもしれませんが、これらの2つのステートメントがまったく異なる理由を理解することは不可欠です。

それを分解するには:

  • 彼らが行う声明は、彼らが使用したベンチマークにのみ適用されます。それはあなたのプログラムについてまったく何も述べていません(あなたのプログラムが彼らのベンチマークの1つとまったく同じでない限り)。

  • ステートメントは、ベンチマークのグループの平均についてです。PyPyを実行すると、テストしたプログラムでも6.3倍の改善が見られるという主張はありません。

  • PyPyがCPythonが実行するすべてのプログラムを実行するだけでなく、さらに高速になるという主張はありません。


15
もちろん、PyPyがすべてのPythonコードをより速く実行できるという主張はありません。しかし、すべての純粋なPythonアプリケーションを使用する場合、それらの大部分がPyPyよりもCPythonよりもはるかに速く(> 3倍)実行されることは間違いありません。
ロバートZaremba

18
最初の2つの箇条書きはどちらも意味がありません。ベンチマークが「プログラムについてはまったく何もない」と言っていると言えるでしょうか。ベンチマークがすべての実際のアプリケーションの完全な指標ではないことは明らかですが、それらは確実に指標として役立ちます。また、ベンチマークのグループの平均を報告する彼らについて何が誤解を招くのか理解できません。彼らはそれが平均だとかなり明確に述べています。プログラマーが平均とは何かを理解していない場合、言語のパフォーマンスよりもはるかに深刻な懸念があります。
Sean Geoffrey Pietz

6
@SeanGeoffreyPietz-PyPyのサイトが誤解を招くものであるとは主張していませんでした。結果は正確に表示されています。しかし、元の質問はそれらを誤って引用し、著者が「平均」という言葉の重要性を理解していないことを示していました。個々のベンチマークの多くは6.3倍高速ではありません。また、異なるタイプの平均を使用すると、異なる値が得られるため、「幾何平均は6.3倍高速」の「6.3倍高速」は適切な要約ではありません。「グループAはグループBのZ倍の速さです」は曖昧すぎて意味がありません。
spookylukey 14

6
-1:@spookylukey主張を裏付ける証拠を提供せずに、ベンチマークスイートにバイアスをかけることを提案しているようです。批判は常に証拠でバックアップされるべきです!
Evgeni Sergeev 2014

5
@EvgeniSergeev-いいえ、私はすべてのベンチマークがバイアスされていることを意味しています!もちろん、必ずしも意図的にではありません。考えられる有用なプログラムの領域は無限であり、信じられないほど多様であり、一連のベンチマークはそれらのベンチマークのパフォーマンスを測定するだけです。「PyPyはCPythonよりどれくらい速いのですか?」OPが知りたいように思われるのは、「フレッドがジョーよりどれだけ速いか?」
spookylukey 2014

74

pypyは100%互換性がないため、コンパイルに8ギガバイトのRAMを必要とし、移動ターゲットであり、非常に実験的です。cpythonは安定しています。20年間モジュールビルダーのデフォルトターゲットです(pypyで動作しないC拡張を含む)。 )、すでに広く展開されています。

Pypyがリファレンス実装になることは決してないでしょうが、それは良いツールです。


2
pypy.org/download.htmlによると、PyPyは(64ビットシステムで)コンパイルするのに8 GBではなく4 GBのRAMを必要とします。また、必要に応じて、そのページに3 GB未満で実行するオプションがあります。
2015年

4
@knite 1:2015年の時点で新しく、ドキュメントは歴史的に8 GBを読みました。2:2015年の実際には、少なくとも8つが必要で、6〜7は無料です。
Tritium21、2015年

4
ビルドまたはディストリビューションを使用する場合、コンパイルに必要なメモリはそれほど重要ではありません。「動くターゲット、そして非常に実験的な」について、壊れているものの例をいくつか挙げていただけますか?繰り返しになりますが、人々がナイトリービルドやソースではなくリリースビルドを使用している場合、彼らは機能性について妥当な期待を持っていませんか?
smci

@smciこれは古代のデータに基づいた古代の質問であり、古代の答えが含まれています。この質問とすべての回答が4年前のpypyの状態の歴史的であると考えてください。
Tritium21 2017

1
@ Tritium21:現在の答えだけに興味があります。それは何ですか?あなたは編集言うことはあなたの答えに好むかもしれない「だった...のPythonのバージョン2.x対pypyを比較し、2013年」(問題の「6.3x-幾何平均」の主張は古くている。また場合など彼らは7.5xを主張しますが、それでもベンチマークに依存します...)、それでも編集が必要です(バージョン番号、最新データなど)。ベンチマークスイートはあまり関連性がないと思うので、誰も実行しません最近のCPUでスクリプト言語でレイトレーシング。私はpybenchmarks.orgを
smci

36

2番目の質問の方が答えやすいです:基本的にです。すべてのコードが純粋なPythonであれば、 PyPyをドロップイン置換として使用ます。ただし、広く使用されている多くのライブラリ(一部の標準ライブラリを含む)はCで記述されており、Python拡張機能としてコンパイルされています。これらのいくつかはPyPyで動作させることができますが、一部は動作しません。PyPyはPythonと同じ「前向き」ツールを提供します---つまり、それはPythonです---しかし、その内部は異なるため、これらの内部とインターフェイスするツールは機能しません。

最初の質問については、最初の質問は一種のCatch-22だと思います。PyPyは速度を向上させ、他のコードとの相互運用性を強化するために急速に進化しています。これにより、公式よりも実験的になりました。

PyPyが安定した状態になると、より広く使用されるようになる可能性があると思います。また、PythonがCの基盤から離れることは素晴らしいことだと思います。しかし、しばらくは起こりません。PyPyはまだクリティカルマスに達していないほとんどのギャップを埋めるために人々に動機を与えるでしょう、あなたがしたいと思うすべてを行うために独自に便利な十分な、。


17
Cは、いつでもどこでも使える言語だとは思いません(私は、私たちの生涯で消えることはありません)。どこでも実行される別の言語ができるまで、Cを使用します(JVMはCで書かれています。「どこでも実行される」言語でさえ、JavaはどこでもCを必要とします)。そのポイントの。
Tritium21 2013

7
@ Tritium21:ええ、私はそこで編集しています。私はCが存在することで大丈夫ですが、PythonのCへの依存は非常に有害であり、PyPyはその理由の良い例です。今ではPythonを高速化する機会がありますが、長年のCに依存してきました。 。Pythonが2本足で立つ方がはるかに優れています。パイソン自体はCで書かれている場合はそれも大丈夫ですが、問題はC.に依存した方法ではPythonを拡張するために人々を奨励拡張メカニズムの存在である
BrenBarn

4
それにダブルエッジソード-Pythonを非常に人気にした理由の1つは、他のアプリケーションを拡張し、他のアプリケーションによって拡張できることです。あなたがそれを取り除けば、私たちはPythonについて話しているとは思いません。
Tritium21 2013

10
@BrenBarn PythonのCへの依存は有害であると主張するのはまったく愚かです。PythonのC-APIがなければ、数値/科学的エコシステム全体とGUIインターフェースを含め、Pythonが10代後半(90年代後半)に獲得した本当に強力なライブラリと優れた相互運用のほとんどは不可能でした。このような包括的なステートメントを作成する前に、Pythonの使用法の全体像を把握してください。
Peter Wang

4
@PeterWangこれらのライブラリはすべてPythonで作成できますが、速度はそれほど速くありません。BrenBarnが言っているのは、それらのlibをPythonで作成できるようにPythonを十分に高速化する機会があるということです。私は彼が有害で何を意味するのかというのは、Cライブラリの存在は悪いことではないと信じていますが、高速のライブラリを作るための唯一の方法は、Cを使用していること
VIKKI

14

このトピックで小さなベンチマークを行いました。他のポスターの多くは互換性について良い指摘をしていますが、私の経験では、PyPyはビットを移動するだけではそれほど速くはありません。Pythonの多くの用途では、2つ以上のサービス間でビットを変換するためだけに存在します。たとえば、データセットのCPU集中型分析を実行しているWebアプリケーションは多くありません。代わりに、クライアントから数バイトを取り、それらをある種のデータベースに格納し、後で他のクライアントに返します。時々、データのフォーマットが変更されます。

BDFLとCPythonの開発者は非常にインテリジェントな人々のグループであり、CPythonがそのようなシナリオで優れたパフォーマンスを発揮できるように管理しています。ここに恥知らずなブログプラグがあります:http : //www.hydrogen18.com/blog/unpickling-buffers.html。CPythonから派生し、完全なCモジュールインターフェイスを保持しているStacklessを使用しています。その場合、PyPyを使用する利点は何も見つかりませんでした。


1
PyPyには、慎重に実行される多くのベンチマークがあります(残念ながら、現時点では実際にユーザー向けのベンチマークスイートがありません)。もちろん、ネットワークトラフィックの場合、PyPyは魔法のように何かを速くすることはできません。
ジュリアン

1
ジュリアン、PyPyの人々が何年もの間、特定のベンチマークスイートのランタイムを改善することに多くの努力を注いできたことは注目に値します。ある程度、彼らはこのベンチマークのセットに最適化を「オーバーフィット」しているようです。私の経験では、純粋に数値的な計算(とにかくFortranまたはC99の方が適しています)は別として、PyPyをこれ以上得たことはありませんCPythonよりも2倍以上高速です。
Alex Rubinsteyn

9
@AlexRubinsteynしかし、PyPyで作業している人たちの見方は、常にPyPyがCPythonよりも遅いケースを見つけ、それを妥当なベンチマークに変えることができれば、スイートに追加される可能性が高いと常に考えてきました。
gsnedders 2013

1
私はあなたのブログをチェックしました。結果では、(pickle、StringIO)のプレーンとPythonのペアは、pypyがcpythonよりも〜6.8倍速いことを示しています。これは有益な結果だと思います。あなたの結論では、pypyコード(プレーンなpythonです!)はCpythonコードではなくCコード(cPickle、cStringIO)よりも遅いことを(正しく)指摘しています。
Caleb Hattingh 2014

1
@gsnedders私はに基づいてベンチマーク提供してきましたrinohtype上の複数 の機会を。彼らはまだそれをスイートに追加していません。
Brecht Machiels 2017

12

Q:PyPyがCPythonと比較してこれらの大きな課題(速度、メモリ消費量、並列処理)を解決できる場合、幅広い採用を妨げているその弱点は何ですか?

A:まず、PyPyチームが一般的に速度の問題解決できるという証拠はほとんどありません。長期的な証拠によると、PyPyは特定のPythonコードをCPythonよりも低速で実行しており、この欠点はPyPyに深く根ざしているようです。

次に、現在のバージョンのPyPyは、かなり大規模なケースでCPythonよりもはるかに多くのメモリを消費します。したがって、PyPyはまだメモリ消費の問題を解決していません。

PyPyが前述の大きな課題を解決し、一般にCPythonよりも高速で、メモリの消費量が少なく、並列処理に友好的かどうかは、短期的に解決できない未解決の問題です。一部の人々は、PyPyがすべてのケースでCPython 2.7および3.3を支配することを可能にする一般的なソリューションを決して提供できないと賭けています。

PyPyが一般にCPythonよりも優れている場合、これは疑わしいですが、その広範な採用に影響する主な弱点は、CPythonとの互換性です。CPythonがより広い範囲のCPUとOSで実行されるという事実などの問題も存在しますが、これらの問題はPyPyのパフォーマンスやCPython互換性の目標と比較するとそれほど重要ではありません。


Q:CPythonからPyPyへの置き換えを今すぐドロップできないのはなぜですか?

A:PyPyは内部でCPythonをシミュレートしていないため、CPythonと100%互換性がありません。一部のプログラムは、Cバインディング、PythonオブジェクトとメソッドのC実装、CPythonのガベージコレクターのインクリメンタルな性質など、PyPyにはないCPythonのユニークな機能に依存している場合があります。


この回答は、ベンチマークを引用したり、参照を提供したりするものではありません。
qwr

7

CPythonには参照カウントとガベージコレクションがあり、PyPyにはガベージコレクションしかありません。

そのため、オブジェクトは以前に削除される傾向があり__del__、CPythonではより予測可能な方法で呼び出されます。一部のソフトウェアはこの動作に依存しているため、PyPyに移行する準備ができていません。

他のいくつかのソフトウェアは両方で動作しますが、未使用のオブジェクトが以前に解放されるため、CPythonではメモリ使用量が少なくなります。(これがどれほど重要で、他の実装の詳細がメモリの使用に影響するかを示す測定値はありません。)


17
__del__CPythonであっても、早期に呼び出されるか、まったく呼び出されることに依存することは間違っていることを強調しておく必要があります。あなたが言うように、それは通常は機能し、一部の人々はそれが保証されていることを意味すると解釈します。オブジェクトを参照する何かが参照サイクルに追いついた場合(これはかなり簡単です-現在の例外を不自然な方法で検査すると参照サイクルが作成されることを知っていましたか?)ファイナライズは、次のサイクルのGCまで無期限に遅延されます(これは決してないかもしれませ)。オブジェクト自体が参照サイクルの一部である場合は、まったく__del__呼び出さません(Python 3.4より前)。

3
オブジェクトあたりのオーバーヘッドはCPythonの方が高く、多くのオブジェクトの作成を開始するとLOTが重要になります。一つには、PyPyはデフォルトでスロットと同等のことを行うと思います。

4

多くのプロジェクトでは、速度の点で異なるpython間で実際に0%の違いがあります。これは、エンジニアリング時間に支配され、すべてのpythonが同量のライブラリサポートを持っているものです。


1
プロジェクトがそれほど単純である場合、明らかにそれは問題ではありませんが、どの言語の実装でも同じことが言えます。比較的パフォーマンスの高いABIを介して他のライブラリの関数を集約するだけの場合、それはすべて無関係です。

1
シンプルとは何の関係もありません。エンジニアリング時間では、フィードバックループが重要です。ランタイムよりも重要な場合があります。
Stephan Eggermont 2014年

1
さて、あなたは非常に漠然と話しています(何が設計されているか、どのような制約があるかなどを参照しない設計時間;何が誰にフィードバックされているかを参照しないフィードバックループなど)。不可解な参照を交換するのではなく、この会話から頭を下げます。

ここには曖昧なものはありません。OODAループ、つまりPDCAを見てください。
Stephan Eggermont 2014年

3
@userさて、PyPyが1000倍高速であったとしても、書き込みに1か月、実行に1分かかる1回実行のプロジェクトでは、PyPyを使用することにより、全体で0.0%の速度向上(1か月+1分vs 1か月)になります。ステファンは、すべてのプロジェクトが0%スピードアップするとは主張していませんでした。
gmatht 2015年

4

これを簡単にするために:PyPyはCPythonにはないスピードを提供しますが、その互換性を犠牲にします。ただし、ほとんどの人は、その速度と(それでもなお推奨されますが)Pythonではなく、柔軟性と「バッテリー組み込み」機能(高い互換性)のためにPythonを選択します。


16
「バッテリー付き」とは、大規模な標準ライブラリ、AFAIKを意味します
tshepang '

4

PyPyがPythonよりも遅い例を見つけました。しかし:Windowsでのみ。

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

したがって、PyPyについて考える場合は、Windowsを忘れてください。Linuxでは、素晴らしい加速を実現できます。例(1から1,000,000までの素数をすべてリスト):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

これは、PythonよりもPyPyで10(!)倍速く実行されます。しかし窓ではない。そこでは、3倍の速さです。


面白い!さらにいくつかの比較と数値は素晴らしいものでした。
ben26941 16

1

PyPyは長い間Python 3をサポートしていますが、2018年4月2日のAnthony ShawによるこのHackerNoonの投稿によると、PyPy3はPyPy(Python 2)よりも数倍遅いです。

多くの科学計算、特に行列計算では、numpyの方が適しています(FAQ:numpyまたはnumpypyをインストールする必要がありますか?を参照)。

Pypyはgmpy2をサポートしていません。代わりにgmpy_cffiを使用できますが 、速度はテストしていません。プロジェクトは2014年に1つのリリースしかありませんでした。

プロジェクトオイラーの問題では、PyPyを頻繁に使用し、単純な数値計算from __future__ import divisionで十分ですが、Python 3のサポートは2018年の時点でもまだ取り組んでおり、最善の策は64ビットLinuxです。2018年12月時点で最新のWindows PyPy3.5 v6.0はベータ版です。


0

サポートされているPythonバージョン

Zen of Pythonを引用するに

読みやすさが重要です。

例えば、Pythonの3.7導入のデータクラスとPython 3.8を導入=をfstring

Python 3.7とPython 3.8には、あなたにとってより重要な他の機能があるかもしれません。重要なのは、PyPyは現時点ではPython 3.7またはPython 3.8をサポートしていないということです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.