10

(这是PyPy 的 Statistical profiler的后续)

我正在 PyPy 下运行一些 Python 代码,并希望对其进行优化。

在 Python 中,我会使用statproflineprofiler知道哪些确切的行导致了减速并尝试解决它们。但是在 PyPy 中,这两个工具都没有真正报告合理的结果,因为 PyPy 可能会优化掉一些行。我也不想使用cProfile,因为我发现很难提取报告函数的哪一部分是瓶颈。

有人对如何进行有一些提示吗?也许另一个在 PyPy 下运行良好的分析器?一般来说,如何为 PyPy 优化 Python 代码?

4

1 回答 1

6

如果您了解 PyPy 架构的工作方式,您就会意识到试图精确定位各个代码行并没有真正的成效。您从用 RPython 编写的 Python 解释器开始,然后通过跟踪 JIT 运行,该 JIT 生成流图,然后转换这些图以优化 RPython 解释器。这意味着由正在运行的 RPython 解释器运行的 Python 代码的布局可能具有与实际运行的优化汇编器非常不同的结构。此外,请记住,JIT 总是在循环或函数上工作,因此逐行获取统计信息并没有那么有意义。因此,我认为cProfile可能对您来说确实是一个不错的选择,因为它会让您了解将优化集中在哪里。一旦您知道哪些函数是您的瓶颈,您就可以针对那些较慢的函数进行优化,而不是尝试修复一行 Python 代码。

执行此操作时请记住,PyPy 的性能特征与 cPython 非常不同。始终尝试以尽可能简单的方式编写代码(这并不意味着尽可能少的行)。还有一些其他的启发式方法会有所帮助,例如使用专门的列表,当你有少量的常量键时使用对象而不是字典,避免使用 C Python API 的 C 扩展等。

如果您真的,真的坚持尝试在线路级别进行优化。有几个选项。一种称为 JitViewer ( https://foss.heptapod.net/pypy/jitviewer ),它可以让您对 JIT 对您的代码执行的操作有一个非常低级别的视图。例如,您甚至可以看到对应于 Python 循环的汇编指令。使用该工具,您可以真正了解 PyPy 对代码的某些部分的行为速度有多快,因为您现在可以做一些愚蠢的事情,比如计算循环中使用的汇编指令的数量等。

于 2013-10-20T23:27:58.357 回答