python - PyPy 的统计分析器

标签 python performance profiling pypy

我想使用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/

相关文章:

python - 更快的方式来做 .format()

ruby - 在分析 ruby​​ 应用程序时是否可以忽略不相关的方法?

swift - weak var : test:UIView! 和 outlets 中的 weak var test :UIView? 有什么区别?

python - 将值转换为整数,同时过滤包含特殊字符的字符串

python - 初始化对象时传递方法的最佳方式是什么

ruby-on-rails - 为什么在将 rails 从 3.1.0 升级到 3.2.0 后我的测试速度很慢?

c++ - 使用数组时的抽象与性能

r - 如何在R中高效使用Rprof?

Python SQL 插入失败

python - 可以在没有神经网络的情况下使用 MXNet gluon.Trainer 吗?