86

Pythonにさらに何かを尋ねると、pythonはマシンのリソースを100%使用せず、実際には高速ではありません。他の多くのインタープリター言語と比較すると高速ですが、コンパイルされた言語と比較すると、違いは本当に素晴らしいです。

Python 3 で Just In Time (JIT) コンパイラを使用して高速化することは可能ですか?

通常、インタープリター言語のパフォーマンスを向上させることができるのは JIT コンパイラーだけなので、これを参照しています。他の解決策が利用可能であれば、新しい回答を受け入れたいと思います。

4

7 に答える 7

83

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

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

しかし、私がここにいる間、誤解についても取り上げさせてください。

通常、JITコンパイラは、インタプリタ言語のパフォーマンスを向上させることができる唯一のものです。

これは正しくありません。JITコンパイラは、その最も基本的な形式では、インタプリタのオーバーヘッドを削除するだけです。これは、表示される速度低下の一部を説明しますが、大部分は説明しません。優れたJITコンパイラーは、動的型付け、ポリモーフィズム、およびさまざまな内省的機能など、一般に多数のPython機能を実装するために必要なオーバーヘッドを(より効率的な実装を可能にする特殊なケースを検出することによって)除去する多数の最適化も実行します。

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

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

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

于 2012-10-23T16:36:56.210 に答える
16

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

于 2012-10-23T16:35:21.570 に答える
10

Numba プロジェクトは Python 3 で動作するはずです。ご質問のとおりではありませんが、試してみてください: https://github.com/numba/numba/blob/master/docs/source/doc/userguide .最初に。

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

于 2012-10-23T16:57:38.020 に答える
7

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

于 2012-10-23T16:32:31.210 に答える
4

これは、このサイトの優れた Python 開発者の何人かによって最もよく答えられるでしょう。

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

ベンチマークの実行に特化したサイトです。指定されたタスクがあります。誰でも好みの言語でソリューションを送信でき、テストで各ソリューションのランタイムが比較されます。ソリューションはピア レビューが可能で、多くの場合、他のユーザーによってさらに改善され、結果が仕様と照合されます。長い目で見れば、これはさまざまな言語を比較するための最も公正なベンチマーク システムです。

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

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

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

于 2012-10-23T16:35:22.847 に答える
2

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

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

于 2012-10-23T16:35:31.383 に答える
0

コードのブロックで速度の改善を探している場合は、 pypyを使用して C にコンパイルされるrpythonicを参照することをお勧めします。Python 用の JIT に変換するデコレータを使用します。

于 2013-11-19T18:52:24.067 に答える