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