为什么Psyco占用大量内存?
4 个回答
2
Psyco的内存占用目前比较大。虽然随着时间的推移,这个占用有所减少,但仍然存在。这个占用和Psyco重写的Python代码量成正比;所以如果你的应用程序只有几个核心的算法函数,那这些函数才是你希望Psyco加速的部分,而不是整个程序。
我认为大内存需求的原因是它需要把源代码加载到内存中,然后再逐步编译。你尝试编译的源代码越多,它需要的内存就越多。我猜如果它还在进行优化的话,它会考虑多种可能的解决方案,以找出最佳的情况。
5
"Psyco利用你程序在运行时处理的实际数据,来生成多个版本的机器代码,每个版本针对不同类型的数据进行了特别优化。" http://psyco.sourceforge.net/introduction.html
很多即时编译器(JIT编译器)都是针对静态类型的语言工作的,这样它们就能知道数据的类型,从而为已知的类型生成机器代码。更优秀的编译器会进行动态分析,如果数据类型是多态的(也就是说同一种类型可以有多种表现),它们会优化那些更常用的代码路径;这在动态类型的语言中也很常见。Psyco似乎采取了一种保守的策略,避免进行全面的程序分析来判断数据类型,或者进行分析来找出正在使用的类型。
† 我对Python的了解不够深入,不确定它是否有动态类型(即在对象创建后可以在运行时改变其结构的类型),或者只是常见的实现只在运行时检查类型;大多数文章只是热衷于讨论动态类型,而没有在Python的背景下真正定义它。
10
来自Psyco网站的内容:“与传统的即时编译器不同,Psyco会为同一段代码写多个版本(这里的代码段是指函数的一部分),这些版本会根据不同类型的变量进行优化(‘类型’可以指数据的种类,但这里的意思更广泛)。”