IronPython 2.7.1中的导入模块非常慢

时间:2012-02-17 11:41:02

标签: import module ironpython

(关于StackOverflow的第一个问题,很高兴在那里:))

我正在使用IronPython 2.7.1和C#.net 4.0。

我使用C#启动我的python脚本。 我有大约20个个人模块,导入了很多时间。 例如:

如果我有module1.py,module2.py,module3.py,module4.py 和main_script.py。

main_script.py导入module1和module2

module1和module2都导入module3。

module1和module3 import module4

模块可能包含大量代码行。

我看到的是当我执行main_script.py时,只需要4-5秒即可导入模块。

我尝试使用pyc.py在dll中编译我的所有模块,然后在其上使用ngen,但是在使用myEngine.Runtime.LoadAssembly()添加此dll时没有看到任何差异。

然后我想使用py_compile.py来获取pyc文件,但似乎不起作用,因为IronPython.Modules.MarshalWriter类(函数WriteObject(object o))不支持IronPython.Runtime.FunctionCode类型。在尝试编译时我得到了“unmarshallable object”异常。

我对Python和IronPython不是很熟悉,也许我并不了解该语言的所有细微之处(实际上我是这么认为的)。我正在网上寻找解决方案,但似乎我现在被卡住了。

是否有提高进口绩效的想法?

1 个答案:

答案 0 :(得分:2)

使用4-5秒进行导入,特别是对于大型模块,对IronPython 2.7.1来说并不意外。我会用pyc.py来改进它,但我也认为它没有以前那么有用 - IronPython的导入速度比以前快很多,所以pyc.py不太有用。

问题是,IronPython在导入模块时比Python做的要多得多[1]。 Python必须解析它并生成然后执行的字节码。 IronPython必须生成DLR树,然后转换为解释器指令 - 如果它们超出编译限制,也可能是IL,这意味着运行.NET JIT以生成机器代码。

如果脚本只需几秒钟就可以运行,那么所有这些工作都会浪费掉; IronPython更适合长时间运行的流程。但是,简短的Python脚本非常常见,而IronPython对于那些类型的脚本来说非常糟糕。

我们正在努力解决这个问题,其中一个方法是你提到的。正在努力支持标准.pyc文件,其中包含针对启动时间而非吞吐量优化的解释器 - 短脚本将受益,但长时间运行的代码将受到影响。其次,将IronPython移植到移动平台需要禁用动态代码生成,因此快速制作DLR解释器非常重要;这项工作将使未编译的代码更快启动。

我们无法克服的一件事是.NET进程通常需要比纯C进程更长的时间。可以减少这种开销,但它需要一些相当深度的优化,可能暂时不会完成。

[1] Python的导入过程非常快,以至于查找文件的stat调用远大于解析和调用的时间。编译它。