代码之家  ›  专栏  ›  技术社区  ›  Phillip B Oldham

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

  •  0
  • Phillip B Oldham  · 技术社区  · 14 年前

    鉴于以下情况:

    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 回复  |  直到 14 年前
        1
  •  3
  •   pberkes    14 年前

    它将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_FAST STORE_FAST

    foo 基本上是一样的 x y

        2
  •  2
  •   wRAR    14 年前
    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        
    

    所以看起来这两个变量是分开的。

        3
  •  0
  •   Roadrunner-EX    14 年前

    我不确定,但我想这会让他们留在记忆中,原因有二。首先,做这件事可能要付出更多的努力。无论哪种方式,性能都不会有很大的变化。其次,变量x和y本身可能正在占用内存(以指针/引用的形式),由于赋值的显式性质,编译器不会触及内存。