2012-07-14 42 views
3

this啓發關於Python緩存小整數的問題。Python編譯器是否可以優化掉某些整數算術?

編譯時Python編譯器是否可以用-6替換(0-6)?下面的代碼表明它沒有。如果不可能,爲什麼不呢?我不認爲0,-6的含義在運行時可能會有所不同。

如果這是可能的,爲什麼CPython不這樣做?萬一

# test_integers.py 
def test_integers(): 
    print "-6 is -6 ?", -6 is -6 # True 
    print "(0 - 6) is -6 ?", (0 - 6) is -6 # False 

# import_test_integers.py 
import test_integers 
test_integers.test_integers() 

我的Python的細節,這是非常依賴於實現:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
+2

FWIW:這種優化稱爲「恆定摺疊」。 (我不知道CPython是否會這樣做。) – 2012-07-14 17:34:51

回答

11

首先,你不應該使用is比較整數值檢測優化。這與任何事情無關,正如你所鏈接的問題所解釋的那樣。如果你想知道你的函數進行優化是什麼,使用dis模塊,其產生(2.7.2,修復您的-1錯字後):

>>> import dis 
>>> 
>>> def test_integers(): 
...  print "-6 is -6 ?", -6 is -6 # True 
...  print "(0-6) is -6 ?", (0 - 6) is -6 # False 
... 
>>> dis.dis(test_integers) 
    2   0 LOAD_CONST    1 ('-6 is -6 ?') 
       3 PRINT_ITEM   
       4 LOAD_CONST    2 (-6) 
       7 LOAD_CONST    2 (-6) 
      10 COMPARE_OP    8 (is) 
      13 PRINT_ITEM   
      14 PRINT_NEWLINE  

    3   15 LOAD_CONST    3 ('(0-6) is -6 ?') 
      18 PRINT_ITEM   
      19 LOAD_CONST    6 (-6) 
      22 LOAD_CONST    2 (-6) 
      25 COMPARE_OP    8 (is) 
      28 PRINT_ITEM   
      29 PRINT_NEWLINE  
      30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   

,你看到減法實際上優化了。您也可以看到其他一些:

>>> def f(): 
...  x = 1+2 
...  x = 2-3 
...  x = 3*4 
...  x = 4/5 
...  x = 5**6 
... 
>>> dis.dis(f) 
    2   0 LOAD_CONST    7 (3) 
       3 STORE_FAST    0 (x) 

    3   6 LOAD_CONST    8 (-1) 
       9 STORE_FAST    0 (x) 

    4   12 LOAD_CONST    9 (12) 
      15 STORE_FAST    0 (x) 

    5   18 LOAD_CONST    4 (4) 
      21 LOAD_CONST    5 (5) 
      24 BINARY_DIVIDE  
      25 STORE_FAST    0 (x) 

    6   28 LOAD_CONST    10 (15625) 
      31 STORE_FAST    0 (x) 
      34 LOAD_CONST    0 (None) 
      37 RETURN_VALUE   
+0

Arg。我正要發表一些有關這方面的內容。很好的答案。 +1 – mgilson 2012-07-14 17:43:54

+0

糾正了錯字,謝謝。仍然消化你的答案的其餘部分 – RoundTower 2012-07-14 17:44:38

+0

這完全回答了我的問題,但現在我更加關心LOAD_CONST和co_consts是如何工作的。如果我找不到或找出答案,會發布後續問題。 – RoundTower 2012-07-14 18:02:17