在CPython中,我认为,import意味着将py文件编译为pyc文件并在当前帧中执行该文件,下次CPython将直接加载pyc文件而不再编译。如何进口铁腕?我觉得ironpython没有类似pyc的格式。每次导入时都会编译吗?
答案 0 :(得分:7)
是的,IronPython会在每次运行时重新编译导入的模块。实际上是两次。
这很复杂。
在第一遍中,Python代码被解析为AST,AST被转换为DLR表达式树,并存储表达式树。当需要执行它时,表达式树被编译成一组简单的基于堆栈的解释器的指令,模块代码在该解释器上执行。跑步时速度不快,但启动时间很短。
在一段代码运行一段时间后,IronPython厌倦了它的速度,回到表达式树,并将代码重新编译成.NET委托。这意味着它将被.NET JIT转换为MSIL,然后转换为本机代码。这段代码执行起来很快,但需要时间来创建。
此转换是基于每个函数(甚至每个循环)完成的,因此如果您重复使用模块中的一个函数而不使用其余函数,则只有一个常用函数将经历完整的IL代码生成和JITting。
然而,这些编译都没有保存到磁盘。 IronPython附带的pyc.py程序可以预编译代码,但它不是自动完成的,因为在运行时生成的代码与pyc.py生成的代码不同。运行时代码通常是可收集的,而pyc.py生成的代码不是 - 并且在运行时生成不可收集的代码会导致内存泄漏。 pyc.py应该通过节省几个步骤来加快导入,但我不确定多少。