Python字节码编译器;删除不必要的变量

时间:2010-09-10 15:48:17

标签: python bytecode

鉴于以下内容:

def foo():
    x = a_method_returning_a_long_list()
    y = a_method_which_filters_a_list(x)
    return y

Python的字节码编译器会保留x&内存中y,还是足够聪明,可以将其减少到以下内容?

def foo():
   return a_method_which_filters_a_list(a_method_returning_a_long_list())

3 个答案:

答案 0 :(得分:3)

它将x和y保留在内存中:

import dis
dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (a_method_returning_a_long_list)
              3 CALL_FUNCTION            0
              6 STORE_FAST               0 (x)

  3           9 LOAD_GLOBAL              1 (a_method_which_filters_a_list)
             12 LOAD_FAST                0 (x)
             15 CALL_FUNCTION            1
             18 STORE_FAST               1 (y)

  4          21 LOAD_FAST                1 (y)
             24 RETURN_VALUE

整个操作非常有效,因为它是使用LOAD_FASTSTORE_FAST代码完成的。

作为其中一条评论中的Roadrunner-EX备注,您的两个foo版本使用的内存量基本相同,因为xy只是引用(即结果的指针。

答案 1 :(得分:2)

In [1]: import dis

In [2]: def f():
   ...:     x = f1()
   ...:     y = f2(x)
   ...:     return y
   ...: 

In [3]: dis.dis(f)
  2           0 LOAD_GLOBAL              0 (f1)
              3 CALL_FUNCTION            0
              6 STORE_FAST               0 (x)

  3           9 LOAD_GLOBAL              1 (f2)
             12 LOAD_FAST                0 (x)
             15 CALL_FUNCTION            1
             18 STORE_FAST               1 (y)

  4          21 LOAD_FAST                1 (y)
             24 RETURN_VALUE        

所以看起来两个变量都是分开存放的。

答案 2 :(得分:0)

我不确定,但我猜它会将它们留在记忆中,原因有两个。首先,它可能比它的价值更多的努力。无论如何都不会有巨大的性能变化。第二,变量x和y本身可能占用内存(以指针/引用的形式),由于赋值的显式特性,编译器不会触及它。