2014-01-06 5 views
5

Pythonコード(または任意のコード)の最適化に関しては、ボトルネックや機能の低下を最適化するためにプロファイリングが終了することがよくあります。しかし、これらのコード領域を最適化する場合、純粋なPythonを使用するためのユースケースはありますかバイトコードインライン? 組み込み関数とcompilerモジュールを使用してこれを行うことができます。bytecodeによるPythonの最適化

答えて

5

...純粋なPythonバイトコードのインラインを使用するためのユースケースはありますか?

はい。場合によっては、Pythonが通常独自に生成するよりも少し速いコードをハンドリングすることができます。

また、リスト内包のループ誘導変数にアクセスできます。ここで

は、あなたが始めるためにいくつかのリンクです:https://www.google.com/search?q=python+bytecode+hacks

あなたがプログラムでバイトコード操作をしたい場合は、ここではそれについて移動する方法を示した最適化のレシピです:Decorator for BindingConstants at compile time

言いました、スピードが気になる場合は、最も単純なスピードアップは、cpythonの代わりにpypyを実行することがよくあります。

4

いいえ。ソースコードは、モジュールが最初にロードされたときに1回のみバイトコードにコンパイルされます。バイトコードは、実行時に解釈されるものです。たとえバイトコードをソースにインライン化することができたとしても、Pythonがソースコードをバイトコードに変換するのに費やした時間を減らすことによって、プログラムの起動時間に影響を与えることに過ぎません。コードの実行速度は実際には変化しません。例えば、1000回実行されるループの「純粋なバイトコード」バージョンは、Pythonソースコードで書かれた同じループより速く実行されません。 this similar questionおよびthis oneを参照してください。

compileおよびcompilerは、プログラムの実行中に文字列から新しい実行可能ソースコードを動的に作成できるように存在します。これはパフォーマンス上の利点ではありません。それを行う方法が他にないからです。 Pythonプログラムを実行すると、Pythonはそのソースコードをバイトコードにコンパイルします。しかし、ソースコードに直接存在しない新しい関数を動的に作成したい場合(例えば、コード断片を混ぜ合わせたり、一致させたり、ユーザーがプログラムの実行中にコードを入力できるようにする)、コンパイルする方法が必要ですオンザフライで、それはcompileのためです。 (これは実際に一般的な必要性ではないので、頻繁に使用されることはありません)。

+2

インラインアセンブラを使用してCコンパイラと同じマシンコードを書くのと同じように、同じ*バイトコードのPythonを書くつもりはありません。ポイントは、より良いバイトコードを書くことです。 – user2357112

+0

@ user2357112:以下の答えは理論的には可能かもしれないが、 'compile'はPythonのソースコードを文字列からコンパイルするだけなので、' compile'を使うことはできません。文字列を 'compile'に渡すことにより、より良いバイトコードを得ることができれば、そのソースコードをプログラムに直接入れるだけで、同じバイトコードを得ることができます。 – BrenBarn

+0

真実ですが、彼はまた 'compiler'モジュールについて言及します。これは' compile'よりも洗練されたコードオブジェクトを構築するために使用できます。もちろん、Pythonバイトコードを手で書くのが好きなら、より簡単な方法は 'types.CodeType'オブジェクトを直接作成することです。 PythonのVMは非常にきれいなスタック指向の獣です。 – Perkins

関連する問題