2010-09-10 49 views
0

考慮以下幾點:Python字節碼編譯器;刪除不必要的變量

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()) 
+0

它真的是減少?任何一個電話的結果都必須保存在某個地方,對吧? – detly 2010-09-10 15:59:56

回答

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只是引用(即指針)的結果。

0

我不確定,但我猜想它會讓他們在內存中,原因有兩個。首先,這可能比做它更有價值。兩種方式都不會有巨大的性能變化。其次,變量x和y本身可能會佔用內存(以指針/引用的形式),由於賦值的明確性質,編譯器不會涉及這些內存。

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   

所以它看起來像兩個變量分開舉行。