为什么Python不优化临时变量?

Bob*_*ein 4 python optimization refactoring python-internals

Fowler的Extract Variable重构方法,以前介绍解释变量,说使用临时变量使代码更清晰.这个想法是通过引入一个不需要的局部变量来阐明复杂的代码,并将该变量命名为出于展示目的.它还提倡对评论进行这种解释. 其他语言优化了临时变量,因此不需要时间或空间资源.为什么Python不这样做?

In [3]: def multiple_of_six_fat(n):
   ...:     multiple_of_two = n%2 == 0
   ...:     multiple_of_three = n%3 == 0
   ...:     return multiple_of_two and multiple_of_three
   ...:

In [4]: def multiple_of_six_lean(n):
   ...:     return n%2 == 0 and n%3 == 0
   ...:
In [5]: import dis

In [6]: dis.dis(multiple_of_six_fat)
  2           0 LOAD_FAST                0 (n)
              3 LOAD_CONST               1 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               2 (0)
             10 COMPARE_OP               2 (==)
             13 STORE_FAST               1 (multiple_of_two)

  3          16 LOAD_FAST                0 (n)
             19 LOAD_CONST               3 (3)
             22 BINARY_MODULO
             23 LOAD_CONST               2 (0)
             26 COMPARE_OP               2 (==)
             29 STORE_FAST               2 (multiple_of_three)

  4          32 LOAD_FAST                1 (multiple_of_two)
             35 JUMP_IF_FALSE_OR_POP    41
             38 LOAD_FAST                2 (multiple_of_three)
        >>   41 RETURN_VALUE

In [7]: dis.dis(multiple_of_six_lean)
  2           0 LOAD_FAST                0 (n)
              3 LOAD_CONST               1 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               2 (0)
             10 COMPARE_OP               2 (==)
             13 JUMP_IF_FALSE_OR_POP    29
             16 LOAD_FAST                0 (n)
             19 LOAD_CONST               3 (3)
             22 BINARY_MODULO
             23 LOAD_CONST               2 (0)
             26 COMPARE_OP               2 (==)
        >>   29 RETURN_VALUE

Mar*_*ers 10

因为Python是一种高度动态的语言,引用可以影响行为.

比较以下内容,例如:

>>> id(object()) == id(object())
True
>>> ob1 = object()
>>> ob2 = object()
>>> id(ob1) == id(ob2)
False
Run Code Online (Sandbox Code Playgroud)

如果Python'优化' ob1ob2变量,行为就会发生变化.

Python对象的生命周期由引用计数控制.将弱引用添加到混合加线程中,您将看到优化离开变量(甚至是本地变量)可能导致不良行为更改.

此外,在Python中,从性能角度来看,删除这些变量几乎不会发生任何变化.本地命名空间已经过高度优化(值由数组中的索引查找); 如果您担心解除引用局部变量的速度,那么您在项目的时间关键部分使用了错误的编程语言.