Python取幂操作和分组的顺序

Ell*_*sky 3 python time operators exponentiation

简单的问题:为什么(7**3) ** 24 % 25几乎没有时间运行,但7 ** 3 ** 24 % 25没有终止?

wim*_*wim 10

从右到左的指数组.

因此,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        
Run Code Online (Sandbox Code Playgroud)

  • 是的,1.6910144928582986e + 238680647722非常大.:-)当然如果我们只关心mod 25,我们可以使用3参数形式的pow来快速得到结果. (2认同)
  • 当它用上标写的时候,顺序很明显但是在这种表示法中我并没有意识到发生了什么. (2认同)