Python PyPy统计分析器

Python PyPy统计分析器,python,performance,profiling,pypy,Python,Performance,Profiling,Pypy,我想用PyPy来分析代码。不幸的是,它似乎不起作用,它指向的行号是关闭的。有人知道如何使其工作或知道其他替代方法吗?很可能是“行号关闭”,因为PyPy在JITted代码中将内联许多函数,并且只在循环结束时发送信号(此处来自计时器)。与CPython相比,CPython在两个随机字节码之间传递信号——有时也在循环的末尾,但通常在任何地方。因此,如果您将信号处理程序限制为仅在“循环结束”字节码处运行,那么PyPy上得到的结果与CPython上得到的结果相同 这就是为什么这种分析似乎总是会错过很多函数

我想用PyPy来分析代码。不幸的是,它似乎不起作用,它指向的行号是关闭的。有人知道如何使其工作或知道其他替代方法吗?

很可能是“行号关闭”,因为PyPy在JITted代码中将内联许多函数,并且只在循环结束时发送信号(此处来自计时器)。与CPython相比,CPython在两个随机字节码之间传递信号——有时也在循环的末尾,但通常在任何地方。因此,如果您将信号处理程序限制为仅在“循环结束”字节码处运行,那么PyPy上得到的结果与CPython上得到的结果相同

这就是为什么这种分析似乎总是会错过很多函数,就像大多数没有循环的函数一样

您可以尝试使用内置的cProfile模块。当然,与统计分析相比,它对性能的影响更大,但无论如何还是要尝试一下——例如,它不会阻止JITting,因此性能的影响仍然应该是合理的

更一般地说,我看不到在PyPy中实现等效于统计分析的简单方法。在存在相互内联然后全局优化的函数的情况下,很难让它有意义。。。我很感兴趣的是,如果你能找到一个工具,对于其他一些高级语言,在一个具有跟踪JIT的VM上进行统计分析


我们可以记录足够的信息来跟踪每个小的汇编指令组,使其返回到真正的Python函数,然后使用hacks在机器级别检查当前的指令指针(IP)。不是不可能,但严肃的工作:-)可能是useful@zel谢谢,但我对PyPy特别感兴趣。谢谢你的详细回复。我以前尝试过cProfile,但它只记录函数调用,即无法判断函数的哪一部分(行)消耗时间。我真的不必使用统计分析,只要我能够以比“某些函数”更高的精度找到瓶颈所在。我知道也有lineprofiler/kernproof,但我认为它也会报告行号。所以我的问题是,一般来说,如何分析/优化PyPy的代码?这与上面的问题略有不同,所以我在这里再次问:如果你真的需要比函数级别更高的精度,你可能会遇到编码问题——不要让你的函数太大,以至于它们包含很多不相关的循环。将它们分开,使每一行理想地只做一件事……如果一个函数包含多行,我又会遇到同样的问题。我认为我不应该为了取悦分析器而将代码拆分成函数——我的意思是,有一些合法的函数跨越几行,我想知道哪些行是有问题的;但我不确定PyPy的逐行结果是否容易理解,因为PyPy类似于C编译器:它优化了代码,使第2行的一半运行在第4行的中间,第3行根本变成没有代码。等等,基本C分析器也只报告每个函数结果;为了获得更多细节,您将包含两个循环的大型C函数拆分为两部分。(请注意,这不是更高级的分析器的情况,而是构建它们的工作——对于PyPy来说,很抱歉,到目前为止还没有人做这项工作……)