Python 的动态特性如何与 PyPy 的内联函数互操作?

How does the dynamic nature of Python interoperate with PyPy's ability to inline functions?

假设你有一个类似 f 的函数调用函数 m.g:

def f(x):
    return m.g(x, 2*x, x+1)

f 被调用了很多,所以 PyPy JITs 它和 inlines m.g 到它。如果稍后,由于 Python 的“动态”性质,m.g 被其他东西取代了: f 的旧 JITed 版本会立即被丢弃,还是仍然可以不小心打来电话了?

此外,如果您的程序经常进行这些重新定义,丢弃的 JITed 版本会导致内存泄漏吗?

你应该没有什么可担心的。如果您正在谈论的是执行了错误的代码,那将是 PyPy 环境中的错误。那是极不可能的。另外,不要担心内存泄漏。即使有一个,它也不会达到您曾经注意到或关心的足够内存。如果您每次执行代码都更改该定义 1000 次,那么您可能会受到某种内存错误影响的唯一方法。我怀疑是这样。

“过早的优化是万恶之源”。也许你听说过这句名言。我认为它也适用于处理将来可能发生但不太可能发生的问题。除非您看到不良行为,否则不要担心这些。我非常怀疑你会。相信您的工具!

回答你的最后一个问题:“如果你的程序做了很多这些重新定义,丢弃的 JITed 版本会导致内存泄漏吗?”这是一个很好的问题,在某些情况下答案可能是肯定的。糟糕的情况可能是 g 是您刚刚使用 execeval 创建的函数,因此最终会在此处调用无限数量的函数对象。这是我们过去考虑过解决的问题,但一直没有时间去做。如果您遇到了看起来像是泄漏的情况并且已经隔离了这部分代码,那么我想说这很可能正是您所担心的。在这种情况下,我建议您写邮件至 pypy-dev@python.org 或在 irc.freenode.net 上访问 #pypy 来描述您的情况。