为什么Psyco占用大量内存?

5 投票
4 回答
632 浏览
提问于 2025-04-15 14:23

Psyco 是一个专门为 Python 设计的编译器。文档中提到

Psyco 会使用大量的内存。

那么,这种内存使用的主要原因是什么呢?大量的内存开销是 JIT 编译器的一个普遍特征吗?

编辑: 感谢大家到目前为止的回答。可能有三个主要原因。

  • 编写多个专门的代码块,每个代码块都需要内存
  • 实时编译源代码带来的额外开销
  • 为了进行动态分析而捕获足够的数据所带来的开销

问题是,哪一个是内存使用的主要因素?我有自己的看法。但我想加个悬赏,因为我希望能接受一个真正正确的答案!如果有人能证明大部分内存是用在哪里的,我会接受这个答案。否则,社区投票选出的答案将在悬赏结束时自动接受。

4 个回答

2

Psyco的内存占用目前比较大。虽然随着时间的推移,这个占用有所减少,但仍然存在。这个占用和Psyco重写的Python代码量成正比;所以如果你的应用程序只有几个核心的算法函数,那这些函数才是你希望Psyco加速的部分,而不是整个程序。

我认为大内存需求的原因是它需要把源代码加载到内存中,然后再逐步编译。你尝试编译的源代码越多,它需要的内存就越多。我猜如果它还在进行优化的话,它会考虑多种可能的解决方案,以找出最佳的情况。

5

"Psyco利用你程序在运行时处理的实际数据,来生成多个版本的机器代码,每个版本针对不同类型的数据进行了特别优化。" http://psyco.sourceforge.net/introduction.html

很多即时编译器(JIT编译器)都是针对静态类型的语言工作的,这样它们就能知道数据的类型,从而为已知的类型生成机器代码。更优秀的编译器会进行动态分析,如果数据类型是多态的(也就是说同一种类型可以有多种表现),它们会优化那些更常用的代码路径;这在动态类型的语言中也很常见。Psyco似乎采取了一种保守的策略,避免进行全面的程序分析来判断数据类型,或者进行分析来找出正在使用的类型。

† 我对Python的了解不够深入,不确定它是否有动态类型(即在对象创建后可以在运行时改变其结构的类型),或者只是常见的实现只在运行时检查类型;大多数文章只是热衷于讨论动态类型,而没有在Python的背景下真正定义它。

10

来自Psyco网站的内容:“与传统的即时编译器不同,Psyco会为同一段代码写多个版本(这里的代码段是指函数的一部分),这些版本会根据不同类型的变量进行优化(‘类型’可以指数据的种类,但这里的意思更广泛)。”

撰写回答