(这是后续PyPy 的统计分析器 https://stackoverflow.com/questions/17346226/statistical-profiler-for-pypy)
我正在 PyPy 下运行一些 Python 代码,并希望对其进行优化。
在Python中,我会使用statprof
or lineprofiler
了解哪些线路导致速度变慢并尝试解决它们。但在 PyPy 中,这两个工具并没有真正报告合理的结果,因为 PyPy 可能会优化掉一些行。我也不想使用cProfile
因为我发现很难提取报告功能的哪一部分是瓶颈。
有人对如何进行有一些建议吗?也许另一个在 PyPy 下工作得很好的分析器?一般来说,如何为 PyPy 优化 Python 代码?
如果您了解 PyPy 架构的工作方式,您就会意识到尝试精确定位各个代码行并不是真正有效。您从用 RPython 编写的 Python 解释器开始,然后通过跟踪 JIT 运行,生成流程图,然后转换这些图以优化 RPython 解释器。这意味着由 RPython 解释器运行的 Python 代码的布局可能与实际运行的优化汇编器有很大不同。此外,请记住,JIT 始终在循环或函数上工作,因此获取逐行统计数据没有多大意义。因此,我认为cProfile
对您来说可能确实是一个不错的选择,因为它会让您了解在哪里集中优化。一旦知道哪些函数是瓶颈,您就可以将优化工作集中在那些速度较慢的函数上,而不是尝试修复一行 Python 代码。
请记住,执行此操作时,PyPy 具有与 cPython 截然不同的性能特征。始终尝试以尽可能简单的方式编写代码(顺便说一句,这并不意味着行数尽可能少)。还有一些其他启发式方法可以提供帮助,例如使用专门的列表、当您拥有少量基本常量的键时使用对象而不是字典、避免使用 C Python API 进行 C 扩展等。
如果您真的非常坚持尝试在生产线级别进行优化。有几种选择。一种称为 JitViewer(https://foss.heptapod.net/pypy/jitviewer https://foss.heptapod.net/pypy/jitviewer),这将使您对 JIT 对代码所做的事情有一个非常低层次的了解。例如,您甚至可以看到与 Python 循环相对应的汇编指令。使用该工具,您可以真正了解 PyPy 对代码某些部分的处理速度有多快,因为您现在可以做一些愚蠢的事情,例如计算循环使用的汇编程序指令的数量或其他操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)