【问题标题】:Python optimization through bytecode通过字节码进行 Python 优化
【发布时间】:2014-01-23 07:46:16
【问题描述】:

当涉及到 Python 代码(或任何代码)的优化时,它通常最终归结为分析以优化瓶颈或慢速函数。但是,在优化这些代码区域时,是否有使用纯 Python bytecode inline 的用例?我知道你可以通过使用compile 内置函数和compiler 模块来做到这一点。

【问题讨论】:

    标签: python python-2.7 optimization bytecode


    【解决方案1】:

    没有。源代码仅在首次加载模块时编译为字节码一次。字节码是在运行时解释的。因此,即使您可以将字节码内联到源代码中,它最多也只会通过减少 Python 将源代码转换为字节码所花费的时间来影响程序的启动时间。它实际上不会改变代码运行的速度。例如,运行 1000 次的“纯字节码”版本的循环不会比用 Python 源代码编写的相同循环运行得更快。请参阅this similar question 和this one。

    compile 和compiler 的存在是为了让您在程序运行时从字符串动态创建新的可执行源代码。这不是为了提高性能,只是因为没有其他方法可以做到这一点。当您运行 Python 程序时,Python 会将其源代码编译为字节码。但是,如果您想动态创建不直接存在于源代码中的新函数(例如,通过混合和匹配代码片段,或允许用户在程序运行时输入代码),您需要一种编译它们的方法在飞行中,这就是compile 的用途。 (这实际上不是一个常见的需求,所以这些功能并不经常使用。)

    【讨论】:

    • 您不会编写 Python 会编写的 same 字节码,就像您不会使用内联汇编器编写与 C 编译器相同的机器代码一样。重点是编写更好的字节码。
    • @user2357112:尽管下面的答案表明这在理论上可能是可行的,但使用compile 是不可能的,因为compile 只是从字符串编译Python 源代码。如果您可以通过将字符串传递给compile 来获得更好的字节码,则只需将该源代码直接放入您的程序即可获得相同的字节码。
    • 没错,但他也提到了compiler 模块,该模块可用于构造比compile 通常提供的更复杂的代码对象。当然,更简单的方法是直接创建types.CodeType 对象,如果您喜欢手动编写python 字节码。 python vm 是一个非常整洁的面向堆栈的野兽。
    【解决方案2】:

    ...有使用纯 Python 内联字节码的用例吗?

    是的。有时,您可以手动编写比 Python 通常自行生成的代码更快的代码。

    此外,您还可以访问循环归纳变量以进行列表推导。

    以下是一些帮助您入门的链接:https://www.google.com/search?q=python+bytecode+hacks

    如果您想以编程方式进行字节码操作,这里有一个优化配方,展示了如何去做:Decorator for BindingConstants at compile time

    也就是说,如果您关心速度,最简单的加速通常是运行 pypy 而不是 cpython(如果您的应用程序允许的话)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2014-07-04
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多