为什么Psycho会使用大量内存?

时间:2009-09-17 11:18:42

标签: python memory compiler-construction jit psyco

Psyco是Python的专用编译器。 documentation states

  

Psyco可以并将使用大量内存。

此内存使用的主要原因是什么?大量内存开销一般是JIT编译器的一个特性吗?

编辑:感谢您的回答。有三种可能的竞争者。

  • 编写多个专用块,每个块都需要内存
  • 由于动态编译源而导致的开销
  • 由于捕获了足够的数据来进行动态分析而导致的开销

问题是,哪一个是内存使用中的主导因素?我有自己的看法。但我正在增加赏金,因为我想接受实际上正确的答案!如果有人能证明或证明大部分内存的使用位置,我会接受它。否则,社区投票的任何人都将在赏金结束时自动接受。

4 个答案:

答案 0 :(得分:10)

来自psyco网站“与JIT编译器的传统方法的不同之处在于,Psyco写了相同块的几个版本(一个块有点像一个函数),它们通过专门化来优化对某些变量(“种类”可以表示一种类型,但它更通用)“

答案 1 :(得分:5)

  

“Psyco使用程序操作的实际运行时数据来编写可能的几个版本的机器代码,每个版本都针对不同类型的数据进行了不同的专用。” http://psyco.sourceforge.net/introduction.html

许多JIT编译器使用静态类型语言,因此他们知道类型是什么,因此只能为已知类型创建机器代码。如果类型是多态的并且优化更常见的路径,则更好的进行动态分析;这通常也适用于具有动态类型†的语言。 Psyco似乎对冲其赌注,以避免进行完整的程序分析以确定类型可能是什么,或分析以找出使用的类型。

<子> †我从来没有深入到Python中去弄清楚它是否有动态类型(在使用该类型创建对象后可以在运行时更改其结构的类型),或仅仅是常见的实现在运行时检查类型;大多数文章只是对动态类型进行了讨论,而没有在Python的上下文中实际定义它。

答案 2 :(得分:2)

  

Psyco的内存开销目前很大。随着时间的推移,我已经减少了一点,但它仍然是一个开销。 此开销与Psyco重写的Python代码量成比例;因此,如果您的应用程序具有一些算法“核心”功能,那么您将希望Psyco加速 - 而不是整个程序。

所以我认为大内存需求是由于它将源代码加载到内存中然后在编译时进行编译。您尝试编译的源越多,它就越需要。我猜想如果它试图在它之上进行优化,那么它将会考虑多种可能的解决方案来尝试确定最佳情况。

答案 3 :(得分:2)

绝对是psyco内存使用来自编译的汇编程序块。 Psyco有时会受到功能过度专业化的影响,这意味着汇编程序有多个版本 块。此外,这也是非常重要的,psyco永远不会释放曾经分配的汇编程序块 即使与之相关的代码已经死了。

如果你在linux下运行你的程序,你可以查看/ proc / xxx / smaps来查看不断增长的匿名内存块,它与堆不同。这是用于写下汇编程序的匿名mmap'部分,当然在没有psyco的情况下运行时它会消失。