2015-04-02 57 views
3

簡單問題: 爲什麼(7**3) ** 24 % 25幾乎沒有時間運行,但7 ** 3 ** 24 % 25沒有終止?Python冪運算和分組順序

+0

運算符優先級.. – wim 2015-04-02 03:42:03

+0

@wim具體是什麼?如果'%'優先於'**',那麼它將計算343到24的冪,這幾乎不需要時間。否則,它與快速表達相同。 – 2015-04-02 03:43:02

回答

10

指數羣from right to left

因此,7 ** 3 ** 24被評估爲7 ** 282429536481(硬),而(7**3) ** 24只是343 ** 24(簡單)。


作爲一個有趣的旁註:CPython的,其中有一個窺視孔優化器,能夠優化掉與常量合併的「容易」的情況。但「硬」的情況下只能摺疊3 ** 24

>>> def foo(): 
     return 7 ** 3 ** 24 % 25 
... 
>>> def bar(): 
     return (7**3) ** 24 % 25 
... 
>>> dis.dis(foo) 
    2   0 LOAD_CONST    1 (7) 
       3 LOAD_CONST    5 (282429536481) 
       6 BINARY_POWER   
       7 LOAD_CONST    4 (25) 
      10 BINARY_MODULO  
      11 RETURN_VALUE   
>>> dis.dis(bar) 
    2   0 LOAD_CONST    7 (1L) 
       3 RETURN_VALUE   
+0

OOOOOOOOH是的!這與常規數學中的相同。對不起,我很蠢。 – 2015-04-02 03:47:22

+2

是的,1.6910144928582986e + 238680647722是相當大的。 :-)當然,如果我們只關心mod 25,我們可以使用pow的三參數形式來快速得到結果。 – DSM 2015-04-02 03:47:54

+2

當它用上標寫出時,順序是顯而易見的,但在這種表示法中,我沒有意識到發生了什麼。 – 2015-04-02 03:48:29