如果您了解 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 对代码的某些部分的行为速度有多快,因为您现在可以做一些愚蠢的事情,比如计算循环中使用的汇编指令的数量等。