【问题标题】:Statistical profiler for PyPyPyPy 的统计分析器
【发布时间】:2013-06-25 03:16:00
【问题描述】:

我想使用statprof.py 在 PyPy 中分析代码。不幸的是,它似乎不起作用,它指向的行号已关闭。有谁知道如何使它工作或知道替代方法?

【问题讨论】:

  • This 可能有用
  • @zel 谢谢,但我对 PyPy 特别感兴趣。

标签: python performance profiling pypy


【解决方案1】:

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

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

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

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

我们可以记录足够的信息来跟踪每组汇编指令返回到它来自的真正 Python 函数,然后使用 hack 在机器级别检查当前指令指针 (IP)。不是不可能,但认真的工作:-)

【讨论】:

  • 感谢您的详细回复。我之前尝试过 cProfile 但它只记录函数调用,即无法判断函数的哪个部分(行)消耗时间。只要我能以比“某些功能”更高的精度找出瓶颈所在的位置,我就不必使用统计分析。我知道还有 lineprofiler/kernproof,但我认为它也会报告行号。所以我的问题真的是,一般如何为 PyPy 分析/优化代码?
  • 这与上面的问题略有不同,所以我在这里再次问:stackoverflow.com/questions/17349822/optimizing-for-pypy
  • 如果你真的需要比函数级别更高的精度,你可能会遇到编码问题——不要让你的函数太大以至于它们包含很多不相关的循环。拆分它们,以便每个人理想地只做一件事......
  • 如果一个函数包含多行,我又遇到了同样的问题。而且我认为我不应该为了取悦分析器而将代码拆分为函数——我的意思是,有一些合法的函数跨越了几行,我想知道哪些行是有问题的。
  • 对不起,我的意思是:cProfile 为您提供整个函数的“整体”结果,是的;但我不确定使用 PyPy 是否容易理解逐行结果,因为 PyPy 就像一个 C 编译器:它优化代码,使第 2 行的一半在第 4 行中间运行,第 3 行变成根本没有代码,等等。基本的 C 分析器也只报告每个函数的结果;要获得更多详细信息,您可以将包含两个循环的大型 C 函数分成两部分。 (请注意,更高级的分析器并非如此,但构建它们是可行的 --- 对于 PyPy,抱歉,到目前为止没有人做这项工作......)
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 2018-07-03
  • 2011-02-22
  • 1970-01-01
  • 2020-08-03
  • 2017-09-28
  • 2011-04-28
  • 2015-05-27
相关资源
最近更新 更多