Pythonが最新のJavascript実装のように最適化されていないのはなぜですか?


11

V8(Chrome)、SpiderMonkey(Firefox)、Chakra(IE / Edge)などの最新のJavascript実装には、すべてJITコンパイルと、パフォーマンスを改善するためのその他の最適化がいくつかあります。

Pythonにこれらがないのはなぜですか?

私はPyPyとIronPythonを見てきましたが、どちらも速度の向上を主張しています。PyPyインタプリタ言語であるPythonで書かれたPython実装が、C。IronPythonのリファレンス実装よりも速くなる方法がわかりません。同じ考えですが、.NET Frameworkがどのように速度を上げるかわかりません。


2
IronPythonは、他の.NET言語と同様に、非常に成熟したJITコンパイラー実装が存在するMicrosoftの「Common Intermediate Language」にコンパイルされます。
Doc Brown

2
プログラミング言語は、ソフトウェアではなく仕様(何らかの文書で記述されています)です。プログラミング言語の実装のみがソフトウェアです(コンパイラーまたはインタープリターも可能です)。
バジルスタリンケビッチ

1
@BasileStarynkevitch:このコメントであなたが私たちに伝えようとしていることはわかりません。OPはCPythonと、PyPyとIronPythonの、について明示的に求めているある特定のPython実装。
Doc Brown

1
@DocBrownは、質問の最後の段落を考えると、関連するポイントのように思えます。これは、Pythonをインタープリター言語と明確に呼ぶときの誤解を示しています。
8bittree

回答:


19

Pythonにこれらがないのはなぜですか?

パフォーマンスを気にするPythonの実装がないと思う理由がわかりません。PyPyIronPython、およびJythonはすべて、パフォーマンスを重視する、非常に強力で生産可能なPython実装です。Pystonは、パフォーマンスのために特別に作成された開発中の実装です。Unladen SwallowPsycoもPythonのパフォーマンスを改善するプロジェクトでした。

ただし、CPythonユーザーが他のすべての実装の合計ユーザーベースを大きく上回っているという事実、Unladen Swallowがコミュニティによって拒否された、これらのプロジェクトのほとんどが開発者を引き付けるために死んでいるか苦労しているという事実は、Pythonがどのようにコミュニティはパフォーマンスを重視しています。

この答えは、Pythonコミュニティの典型的な考え方の良い例です。パフォーマンスの問題を修正する代わりに、彼らは単にPythonではなくコードを書くことを好むでしょう。

私はPyPyとIronPythonを見てきましたが、どちらも速度の向上を主張しています。PyPyインタプリタ言語であるPythonで書かれたPython実装が、Cのリファレンス実装よりも高速になる方法がわかりません。

まず、コンパイラーがどの言語で書かれているかは関係ありません。結局、コンパイラーは一だけ実行されるので、たとえ遅いとしてもそれは関係ありません。コンパイラーのパフォーマンスは無関係です。コンパイラの出力のパフォーマンスです。

第二に、コンパイラの出力がどれだけ速いかが重要であり、コンパイラはPython、つまりコンパイルする言語で書かれているため、実際にコンパイルすることで高速化できます。

第三に、「解釈された言語」のようなものはありません。言語は、数学的な規則と制限のセットです。仕様です。一枚の紙。言語はコンパイルも解釈もされません。言語はただです。コンパイルと解釈は、言語の実装の特徴であり、より正確には、言語ではなくコンパイラーまたはインタープリターの特徴です。すべての言語はコンパイラーによって実装できます。すべての言語はインタプリタによって実装できます。インタープリターからコンパイラーを、コンパイラーからインタープリターを機械的に生成できます。

しかし、PyPyは実際に Pythonで書かれていないため、これらすべては実際には重要ではありません。RPythonで書かれています。RPythonは、RPythonプログラミング言語とRPythonフレームワークの2つの部分で構成されています。

RPythonプログラミング言語はPythonではありません。別のプログラミング言語です。RPythonは静的に型付けされたプログラミング言語であり、Javaとほぼ同じレベルにあり、Cとほぼ同じパフォーマンスを備えています。RPythonはPythonの構文および意味のサブセットです。つまり、すべてのRPythonプログラムは有効なPythonプログラムであり、 Python実装によって実行されます(通常は数桁遅くなりますが、Pythonのすべてのツールにアクセスでき、すぐに解釈が開始されるので、これはデバッグに役立ちますが、言語実装のコンパイルには通常約5-10分かかります)、しかしその逆は真実ではありません。

RPythonフレームワークは、RPythonプログラミング言語で高性能の動的言語実装を記述するためのフレームワークです。ガベージコレクタ、オブジェクトスペース、メタオブジェクトプロトコル、定義済みオブジェクト、タイプ、操作などが含まれます。しかし、最も重要な点は、インタープリターからJITコンパイラーを自動的に生成できることです。RPythonフレームワークに言語を実装する場合、インタープリターを記述するだけで、RPythonフレームワークがJITを処理します。

PyPyだけでなく、RPythonプラットフォームは多くの言語実装があります

IronPython、同じ考えですが、.NET Frameworkがどのように速度を上げるかわかりません。

Microsoftのさまざまな.NETバリアントやMonoなど、ISO CLIのほとんどの実装には、洗練されたガベージコレクター、オプティマイザー、およびコンパイラーが含まれています。JythonおよびJavaの実装にも同じことが当てはまります。

IronPythonはコンパイラーであり、PythonソースコードをDLRツリー(DLRは動的言語ランタイム)にコンパイルします。DLRツリーはCILバイトコードにさらにコンパイルされ、通常は再びネイティブマシンコードにさらにコンパイルされます。


6

V8(Chrome)、SpiderMonkey(Firefox)、Chakra(IE / Edge)などの最新のJavascript実装には、すべてJITコンパイルと、パフォーマンスを改善するためのその他の最適化がいくつかあります。

Pythonにこれらがないのはなぜですか?

JavaScriptはWebブラウザーに含まれており、今日ではかなりの量のソフトウェアがWebブラウザーで実行されるように設計されています。これにより、JavaScriptのパフォーマンスが非常に重要になり、Google、Apple、Microsoftなどの企業はJavaScriptランタイムを高速化するために多くのリソースを投資しています。このお金の流れがPythonにリダイレクトされていれば、同様に高速になります。

PyPyインタプリタ言語であるPythonで書かれたPython実装が、Cのリファレンス実装よりも高速になる方法がわかりません。

いったんコードがJITされると、それはもはや「解釈されない」という考え方です。PyPIは、Pythonコードをマシンコード(x86_64マシンコードなど)に変換し、プロセッサで直接実行することで機能します。


3
特に重要なのは、WebブラウザーにはJavaScriptに代わるものがないことです(少なくとも、すべての主要なブラウザーで一般的に利用できるものはまだありません)。Webブラウザーで高速のパフォーマンスが必要な場合は、高速なJavaScript実装が必要です。一方、Pythonを実行するプラットフォームでは、パフォーマンスが向上した別の言語にほぼ確実に移行できます。
8bittree

-3

pythonコードをメインのpythonファイルとしてシンプルな最上位のスタートアップ(モジュール内に非常に少ないコード)でモジュールに構造化する場合、pythonは残りのすべてのコードをマシンに依存しないバイトコードにコンパイルします。ディレクトリ構造に表示される.pycファイル。これにより、最初の実行後の読み込み時間と解釈時間が最小限になります。

-Oまたは-OOフラグを使用してスクリプトを起動するか、PYTHONOPTIMIZEを0より大きい値に設定すると、.pyoファイルが生成され、さらに最適化されます。

特定の関数に対して高度な最適化が必要な場合は、C、C ++、FORTRAN、またはGOで記述し、Python内から使用できます。


非C拡張機能をPythonにどのように統合しますか?CythonのC拡張のみを認識しています。

1
@Bey:基本的に、共有ライブラリ(.dllまたは.so)内のすべてのものは、関数シグネチャを知っていればpythonから呼び出すことができます-これらは、swingなどのツールによって生成されるか、doxygenドキュメントから生成される手動で構成できます。stackoverflow.com/questions/5811949/...があると便利ですblog.heroku.com/see_python_see_python_go_go_python_go
スティーブ・バーンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.