8

私はこれがおそらく非常に明白な答えであり、役に立たない卑劣なコメントに自分自身をさらしていることを知っていますが、答えがわからないので、ここに行きます。

Pythonが実行時にバイトコードにコンパイルされる場合、時間がかかるのはその最初のコンパイル手順だけですか?その場合、それはコードのわずかな初期費用ではありません(つまり、コードが長期間実行されている場合、CとPythonの違いは減少しますか?)

4

2 に答える 2

18

Pythonコードが解釈されるという事実だけでなく、Pythonコードが遅くなりますが、それは間違いなく、取得できる速度に制限を設定します。

バイトコード中心の観点が正しければ、PythonコードをCと同じくらい高速にするには、インタープリターループを関数への直接呼び出しに置き換え、バイトコードを削除して、結果のコードをコンパイルするだけです。しかし、それはそのようには機能しません。私の言葉を受け入れる必要もありません。自分でテストすることができます。CythonはPythonコードをCに変換しますが、変換されてコンパイルされた一般的なPython関数は、Cレベルの速度を示しません。このようにして作成された典型的なCコードを見て、その理由を確認するだけです。

本当の課題は、多重ディスパッチ(または正しい専門用語が何であれ-私はそれをすべてまっすぐに保つことはできません)です。これは、とが両方とも整数または浮動小数点数であることがわかっているa+b場合、 1つのopにコンパイルできるという事実を意味します。 C、Pythonでは、計算するためにさらに多くのことを行う必要があります(名前がバインドされているオブジェクトを取得する、経由するなど)aba+b__add__

これが、CythonをC速度に到達させるために、クリティカルパスでタイプを指定する必要がある理由です。これは、Shedskinが(デカルト積)型推論を使用してPythonコードを高速化し、C++を取得する方法です。そして、PyPyがどのように高速になるか-JITは、コードがどのように動作しているかに注意を払い、型などに特化することができます。それぞれのアプローチは、コンパイル時であろうと実行時であろうと、ダイナミズムを排除するので、それが何をしているのかを知っているコードを生成することができます。

于 2012-12-13T05:01:53.840 に答える
8

バイトコードはCPUにとって自然ではないため、解釈が必要です(インタープリターと呼ばれるCPUネイティブコードによる)。バイトコードの利点は、最適化、事前計算を可能にし、スペースを節約できることです。Cコンパイラはマシンコードを生成し、マシンコードは解釈を必要とせず、CPUにネイティブです。

于 2012-12-13T04:42:09.103 に答える