在ironpython中导入模块时会发生什么?

时间:2011-12-08 06:19:31

标签: python import ironpython dynamic-language-runtime

在CPython中,我认为,import意味着将py文件编译为pyc文件并在当前帧中执行该文件,下次CPython将直接加载pyc文件而不再编译。如何进口铁腕?我觉得ironpython没有类似pyc的格式。每次导入时都会编译吗?

1 个答案:

答案 0 :(得分:7)

是的,IronPython会在每次运行时重新编译导入的模块。实际上是两次。

这很复杂。

在第一遍中,Python代码被解析为AST,AST被转换为DLR表达式树,并存储表达式树。当需要执行它时,表达式树被编译成一组简单的基于堆栈的解释器的指令,模块代码在该解释器上执行。跑步时速度不快,但启动时间很短。

在一段代码运行一段时间后,IronPython厌倦了它的速度,回到表达式树,并将代码重新编译成.NET委托。这意味着它将被.NET JIT转换为MSIL,然后转换为本机代码。这段代码执行起来很快,但需要时间来创建。

此转换是基于每个函数(甚至每个循环)完成的,因此如果您重复使用模块中的一个函数而不使用其余函数,则只有一个常用函数将经历完整的IL代码生成和JITting。

然而,这些编译都没有保存到磁盘。 IronPython附带的pyc.py程序可以预编译代码,但它不是自动完成的,因为在运行时生成的代码与pyc.py生成的代码不同。运行时代码通常是可收集的,而pyc.py生成的代码不是 - 并且在运行时生成不可收集的代码会导致内存泄漏。 pyc.py应该通过节省几个步骤来加快导入,但我不确定多少。