如果您了解PyPy架构的工作方式,您就会意识到尝试精确定位各行代码并不是很有效.您首先使用RPython编写的Python解释器,然后通过跟踪JIT运行,该JIT生成流图,然后转换这些图以优化RPython解释器.这意味着由正在运行JY的RPython解释器运行的Python代码的布局可能与实际运行的优化汇编器具有非常不同的结构.此外,请记住,JIT始终适用于循环或函数,因此获取逐行统计信息并不那么有意义.因此,我认为cProfile
可能真的是一个很好的选择,因为它会让你知道在哪里集中优化.一旦你知道哪些功能是你的瓶颈,你可以花费你的优化工作来针对那些较慢的功能,而不是试图修复一行Python代码.
请记住,PyPy具有与cPython截然不同的性能特征.总是尝试以尽可能简单的方式编写代码(这并不意味着尽可能少的行btw).还有一些其他启发式方法可以帮助您使用专门的列表,当您拥有少量大多数常量键时使用对象而不使用C++ API,等等.
如果你真的,真的坚持尝试在线级优化.有几个选择.一个叫做JitViewer(https://bitbucket.org/pypy/jitviewer),它可以让你对JIT对你的代码所做的工作有一个很低级别的视图.例如,您甚至可以看到对应于Python循环的汇编程序指令.使用该工具,您可以真正了解PyPy对代码的某些部分的行为有多快,因为您现在可以执行愚蠢的操作,例如计算用于循环的汇编程序指令的数量等等.