python - Python 是否优化了仅用作返回值的变量?

标签 python interpreter python-internals

以下两个代码片段之间有什么最终区别吗?第一个为函数中的变量赋值,然后返回该变量。第二个函数只是直接返回值。

Python 是否会将它们转换为等效的字节码?其中一个更快吗?

案例 1:

def func():
    a = 42
    return a

案例 2:

def func():
    return 42

最佳答案

不,它没有

编译成 CPython 字节码只通过一个小的 peephole optimizer旨在仅进行基本优化(有关这些优化的更多信息,请参阅测试套件中的 test_peepholer.py)。

要查看实际发生的情况,请使用 dis* 查看生成的指令。对于第一个函数,包含赋值:

from dis import dis
dis(func)
  2           0 LOAD_CONST               1 (42)
              2 STORE_FAST               0 (a)

  3           4 LOAD_FAST                0 (a)
              6 RETURN_VALUE

同时,对于第二个功能:

dis(func2)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

第一个中使用了另外两个(快速)指令:STORE_FASTLOAD_FAST .这些可以快速存储和抓取当前执行帧的 faSTLocals 数组中的值。然后,在这两种情况下,都会执行 RETURN_VALUE。因此,由于需要执行的命令更少,第二个速度快。

通常,请注意 CPython 编译器在其执行的优化方面是保守的。它不是而且 并没有尝试像其他编译器一样聪明(通常,它们也有更多的信息可以使用)。除了明显正确之外,主要设计目标是 a) 保持简单 b) 尽可能快地编译它们,这样您甚至不会注意到存在编译阶段。

最后,您不应该为这样的小问题而烦恼。速度方面的好处是微小的、恒定的,并且与解释 Python 所带来的开销相比相形见绌。

* dis是一个反汇编你的代码的小 Python 模块,你可以使用它来查看 VM 将执行的 Python 字节码。

注意:正如@Jorn Vernee 在评论中所说,这是特定于 Python 的 CPython 实现的。如果需要,其他实现可能会进行更积极的优化,而 CPython 不会。

关于python - Python 是否优化了仅用作返回值的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390869/

相关文章:

python - 如何通过命令行在 VS Code 中访问更新的 Python 3.9?

python - 为什么在同一行中创建的两个对象具有相同的对象,但这与列表不同?

python - Python的List是如何实现的?

python - 在 flask socketio 后台任务中访问应用上下文

python - 点击: Customize "Missing argument" error handling by overriding UsageError's show function

python - 使图例对应于matplotlib中散点的颜色

javascript - 从 Python 解释 Javascript

python - 优化零重力二维空间中粒子的重力计算

javascript - 是否可以直接评估Mapbox表达式?

python - @property 装饰器在 Python 中是如何工作的?