CPythonでは、importは、pyファイルをpycファイルにコンパイルして現在のフレームでファイルを実行することを意味し、次にCPythonはpycファイルを再度コンパイルせずにロードします。 Ironpythonでのインポートはどうですか?私はironpythonはpycのようなフォーマットを持っていないと思う。インポートするたびにコンパイルされますか?ironpythonでモジュールをインポートするとどうなりますか?
答えて
はい、IronPythonは、実行ごとにインポートされたモジュールを再コンパイルします。実際には2倍。
複雑です。
最初のパスで、PythonコードがASTに解析され、ASTがDLR式ツリーに変換され、式ツリーが格納されます。実行するときは、単純なスタックベースのインタプリタのために式ツリーが一連の命令にコンパイルされ、そのインタープリタ上でモジュールコードが実行されます。走っていても速いわけではありませんが、スタートアップ時間はほとんどありません。
コードがしばらく実行された後、IronPythonは遅くなってしまい、式ツリーに戻り、コードを.NETデリゲートに再コンパイルします。つまり、.NET JITによってMSILとネイティブコードに変換されます。このコードは実行は高速ですが、作成に時間がかかります。
この変換は、関数単位(またはループ単位)単位で行われるため、モジュールの関数を繰り返し使用し、残りの関数を使用しない場合は、一般的に使用される関数の1つのみが完全なILコードジェネレーションとJITting。
ただし、このコンパイルはディスクに保存されません。 IronPythonに含まれるpyc.pyプログラムはコードをプリコンパイルできますが、実行時に生成されたコードがpyc.pyによって生成されたコードと異なるため、自動的には実行されません。 Pyc.pyによって生成されたコードは実行されませんが、ランタイムコードは通常収集可能です。実行時に収集できないコードを生成するとメモリリークが発生します。 pyc.pyは、いくつかのステップを保存することで、インポートを高速化する必要がありますが、どれくらいの量であるかは分かりません。
ありがとうございます! – zchenah
まだ誰も答えませんか?それは私自身に答える必要があるようです... – zchenah