繁体   English   中英

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

[英]What happens when import a module in ironpython?

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

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

情况很复杂。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM