【问题标题】:Optimizing for PyPy针对 PyPy 进行优化
【发布时间】:2013-06-25 08:21:40
【问题描述】:

(这是Statistical profiler for PyPy的后续)

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

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

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

【问题讨论】:

    标签: python optimization profiling pypy


    【解决方案1】:

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

    【讨论】:

    • 你有什么建议?
    • 鉴于 PyPy 的实际工作方式,我的建议是只使用 cProfile。我的第二个建议是使用 JitViewer,如果你真的需要对代码的性能特征有一个低层次的了解。
    • 在编译和优化实现解释器本身的 RPython 代码时应用流程图转换,不是您的 Python 代码。这些转换等同于 C 编译器应用于 CPython 解释器的 C 代码的转换,与最终用户的 Python 代码无关。 PyPy 的 JIT 确实存在您正在谈论的那种问题;热循环可能会被 JIT 编译为多个不同的汇编代码块,这使得将性能映射回单个 Python 语句变得很棘手。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2011-08-01
    • 2010-09-06
    • 1970-01-01
    • 2013-03-17
    • 2013-01-18
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多