我想使用statprof.py用于在 PyPy 中分析代码。不幸的是,它似乎不起作用,它指向的行号已关闭。有谁知道如何使其发挥作用或知道替代方案吗?
最佳答案
很可能“行号已关闭”,因为 PyPy 在 JITted 代码中将内联许多函数,并且仅在循环结束时传递信号(此处来自计时器)。将此与 CPython 进行比较,CPython 在两个随机字节码之间传递信号——偶尔也在循环末尾,但通常在任何地方。因此,如果您将信号处理程序限制为仅在“循环结束”字节码处运行,那么您在 PyPy 上得到的结果与在 CPython 上得到的结果相同。
这就是为什么这种分析似乎总是会错过很多函数,就像大多数没有循环的函数一样。
您可以尝试使用内置的cProfile模块。当然,它比统计分析会带来更大的性能损失,但无论如何都要尝试一下——例如,它不会阻止 JITting,因此性能损失应该仍然是合理的。
更一般地说,我没有看到在 PyPy 中实现相当于统计分析的简单方法。在存在相互内联然后全局优化的函数的情况下,很难赋予它意义......如果你能发现一个工具确实存在,对于其他一些高级语言来说,做统计,我会很感兴趣在具有跟踪 JIT 的虚拟机上进行分析。
我们可以记录足够的信息来跟踪每一小组汇编指令,追溯到它来自的真实 Python 函数,然后使用 hacks 在机器级别检查当前的指令指针 (IP)。并非不可能,而是认真的工作:-)
关于python - PyPy 的统计分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17346226/