优化PyPy

时间:2013-06-27 17:40:13

标签: python optimization profiling pypy

(这是Statistical profiler for PyPy

的后续行动

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

在Python中,我会使用statproflineprofiler来确定导致减速的确切行并尝试解决它们。但是在PyPy中,两个工具都没有真正报告合理的结果,因为PyPy可能会优化掉某些行。我也不想使用cProfile,因为我发现很难将报告的部分功能作为瓶颈。

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

1 个答案:

答案 0 :(得分:6)

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

请记住,PyPy具有与cPython截然不同的性能特征。总是尝试以尽可能简单的方式编写代码(这并不意味着尽可能少的行btw)。还有一些其他的启发式方法可以帮助您使用专门的列表,当您拥有少量大多数常量键时使用对象而不使用C Python API等来避免C扩展等等。

如果你真的,真的坚持尝试在线级进行优化。有几个选择。一个叫做JitViewer(https://bitbucket.org/pypy/jitviewer),它可以让你对JIT对你的代码所做的工作有一个非常低级的视图。例如,您甚至可以看到对应于Python循环的汇编程序指令。使用该工具,您可以真正理解PyPy对代码的某些部分的快速行为,因为您现在可以执行愚蠢的操作,例如计算用于循环的汇编器指令的数量等。