web-dev-qa-db-ja.com

Python 3インタープリターにはJIT機能がありますか?

Pythonにもっと質問すると、pythonは100%でマシンリソースを使用せず、実際には高速ではありません。他の多くのインタプリタ言語と比較すると高速ですが、比較するとコンパイルされた言語に対して、その違いは本当に驚くべきものだと思います。

Python 3?)のJust In Time(JIT)コンパイラーで物事を高速化することが可能です。

通常、インタプリタ言語のパフォーマンスを向上させることができるのはJITコンパイラだけなので、他のソリューションが利用可能な場合は新しい答えを受け入れたいと思います。

56
guz

まず、Python 3(.x)は言語であり、任意の数の実装が可能です。さて、今日までCPython以外の実装はありません実際にこれらのバージョンの言語を実装していますが、それは変わります(PyPyが追いついています)。

あなたが尋ねるつもりだった質問に答えるために:CPython、3.xまたはそれ以外は、JITコンパイラを含んでいない、含んでいない、おそらく含んでいない。他のいくつかのPython実装(PyPyネイティブ、JythonおよびIronPythonは、ビルドする仮想マシンにJITコンパイラを再利用することにより))にはJITコンパイラがあります。JITコンパイラが停止する理由はありませんPython 3のサポートを追加するときに動作します。

しかし、私がここにいる間、誤解にも対処しましょう。

通常、インタプリタ言語のパフォーマンスを改善できるのはJITコンパイラだけです

これは正しくありません。 JITコンパイラーは、最も基本的な形で、インタープリターのオーバーヘッドを除去するだけです。これは、大部分ではなく速度低下の一部を説明します。 good JITコンパイラは、多数のPython機能をより効率的に実装できる特別なケースを検出することにより) 、ダイナミックタイピング、ポリモーフィズム、さまざまな内省的機能などの顕著な例です。

aコンパイラを実装するだけでは役に立ちません。非常に巧妙な最適化が必要です。そのほとんどは、特定の状況で限られた時間枠でのみ有効です。 JITコンパイラーはここで簡単に実行できます。実行時に特殊なコードを生成できるため(全体として)、実行中にプログラムを観察することでプログラムをより簡単に(より正確に)分析でき、無効になったときに最適化を取り消すことができます。また、事前のコンパイラとは異なり、インタプリタと対話することもできます。これは、賢明な設計上の決定であるため、頻繁に行います。彼らが独立して存在する可能性があり、実際に存在しているにもかかわらず、人々の心の中で通訳者にリンクされているのはこのためだと思います。

インタプリタのコード自体の最適化以外に、Python実装を高速化する他のアプローチもあります。たとえば、HotPy(2)プロジェクトです。しかし、これらは現在研究または実験段階にあり、まだ実際のコードに対する有効性(および成熟度)を示していません。

そしてもちろん、特定のプログラムのパフォーマンスは、言語の実装よりもプログラム自体に大きく依存します。言語の実装は、操作のシーケンスを作成する速度の上限のみを設定します。一般に、不必要な作業を回避するだけで、つまりプログラムを最適化することで、プログラムのパフォーマンスを大幅に向上させることができます。これは、プログラムをインタープリター、JITコンパイラー、または事前処理コンパイラーのいずれで実行するかに関係なく当てはまります。何かを高速にしたい場合は、邪魔にならないようにして、より高速な言語実装を取得してください。解釈と動的性のオーバーヘッドで実行不可能なアプリケーションがありますが、それらはあなたが思うほど一般的ではありません(そして、多くの場合、マシンコードコンパイルされたコードを選択的に呼び出すことで解決されます)。

59
user395760

JITを持つ唯一のPython実装は PyPy です。 Byt-PyPyはPython 2実装とPython 3実装の両方です。

14
Ngure Nyaga

NumbaプロジェクトはPython 3.で動作するはずです。正確にあなたが尋ねたものではありませんが、試してみることをお勧めします: https:// github .com/numba/numba/blob/master/docs/source/doc/userguide.rst

現時点では、すべてのPython構文をサポートしていません。

8
rubik

pypy py3 branch を試すことができます。これは 多かれ少なかれ python互換ですが、公式のCPython実装にはJITがありません。

5
lolopop

これは、このサイトの注目すべきPython開発者の一部によって最もよく答えられます。

それでもコメントしたい:通訳言語の速度について議論するとき、私は この場所:Computer Language Benchmarks Game でホストされているプロジェクトを指すのが好きです。

ベンチマークの実行専用のサイトです。特定のタスクを実行する必要があります。誰でも自分の好みの言語でソリューションを提出でき、テストは各ソリューションの実行時間を比較します。ソリューションはピアレビューが可能で、多くの場合、他のユーザーによってさらに改善され、結果は仕様に照らしてチェックされます。長期的には、これは異なる言語を比較するための最も公正なベンチマークシステムです。

このような指示の概要 からわかるように、コンパイルされた言語はインタープリター言語と比較して非常に高速です。ただし、コンパイルの正確なタイプにはおそらくそれほど違いはありません。Python(およびpythonよりも遅いグラフのその他)は完全に動的です。オブジェクトを変更できます。型はその場で変更できるため、一部の型チェックはコンパイル時ではなく実行時まで延期する必要があります。

したがって、コンパイラーの利点について議論することはできますが、異なる言語には異なる機能があることを考慮する必要があります。そして、これらの機能は本質的な価格で提供される場合があります。

最後に、速度について話すとき、ほとんどの場合、問題ではない言語と言語の知覚された遅さではなく、それは悪いアルゴリズムです。遅すぎるため言語を切り替える必要はありませんでした。コードに速度の問題がある場合、アルゴリズムを修正します。ただし、コードに時間がかかり、計算量の多いループがある場合、通常は再コンパイルする価値がありますis。顕著な例は、スクリプト言語で使用されるCでコード化されたライブラリです(Perl XSライブラリ、またはPythonの場合はnumpy/scipy、lapack/blasは多くのスクリプト言語のバインディングで利用可能なライブラリの例です)

3
cfi

バイトコード表現のジャストインタイムコンパイラのようにJITを意味する場合、そのような機能があります(2.2以降)。機械語に対するJITを意味する場合、いいえ。しかし、バイトコードへのコンパイルにより、パフォーマンスが大幅に向上します。マシンコードにコンパイルする場合は、Pypyが探している実装です。

注:pypyはPython 3.xでは動作しません

1
Aniket Inge

コードブロックの速度の改善を探している場合は、pypyを使用してCにコンパイルする rpythonic をご覧ください。 Python用のJITに変換するデコレーターを使用します。

0
jdavid_1385