(关于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不是很熟悉,也许我并不了解该语言的所有细微之处(实际上我是这么认为的)。我正在网上寻找解决方案,但似乎我现在被卡住了。
是否有提高进口绩效的想法?
答案 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调用远大于解析和调用的时间。编译它。