2011-12-08 13 views
6

CPythonでは、importは、pyファイルをpycファイルにコンパイルして現在のフレームでファイルを実行することを意味し、次にCPythonはpycファイルを再度コンパイルせずにロードします。 Ironpythonでのインポートはどうですか?私はironpythonはpycのようなフォーマットを持っていないと思う。インポートするたびにコンパイルされますか?ironpythonでモジュールをインポートするとどうなりますか?

+0

まだ誰も答えませんか?それは私自身に答える必要があるようです... – zchenah

答えて

7

はい、IronPythonは、実行ごとにインポートされたモジュールを再コンパイルします。実際には2倍。

複雑です。

最初のパスで、PythonコードがASTに解析され、ASTがDLR式ツリーに変換され、式ツリーが格納されます。実行するときは、単純なスタックベースのインタプリタのために式ツリーが一連の命令にコンパイルされ、そのインタープリタ上でモジュールコードが実行されます。走っていても速いわけではありませんが、スタートアップ時間はほとんどありません。

コードがしばらく実行された後、IronPythonは遅くなってしまい、式ツリーに戻り、コードを.NETデリゲートに再コンパイルします。つまり、.NET JITによってMSILとネイティブコードに変換されます。このコードは実行は高速ですが、作成に時間がかかります。

この変換は、関数単位(またはループ単位)単位で行われるため、モジュールの関数を繰り返し使用し、残りの関数を使用しない場合は、一般的に使用される関数の1つのみが完全なILコードジェネレーションとJITting。

ただし、このコンパイルはディスクに保存されません。 IronPythonに含まれるpyc.pyプログラムはコードをプリコンパイルできますが、実行時に生成されたコードがpyc.pyによって生成されたコードと異なるため、自動的には実行されません。 Pyc.pyによって生成されたコードは実行されませんが、ランタイムコードは通常収集可能です。実行時に収集できないコードを生成するとメモリリークが発生します。 pyc.pyは、いくつかのステップを保存することで、インポートを高速化する必要がありますが、どれくらいの量であるかは分かりません。

+0

ありがとうございます! – zchenah