Python指数运算的优先级和分组

3
简单的问题: 为什么 (7**3) ** 24 % 25 几乎不需要运行时间,但是 7 ** 3 ** 24 % 25 不会停止运行?

运算符优先级 - wim
@wim 具体是什么?如果 % 的优先级高于 **,那么它将计算 343 的 24 次方,这几乎不需要时间。否则它与快速表达式相同。 - Elliot Gorokhovsky
1个回答

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        

哦,是的!那与普通数学中一样。抱歉,我太蠢了。 - Elliot Gorokhovsky
2
是的,1.6910144928582986e+238680647722相当大。:-) 当然,如果我们只关心mod 25,我们可以使用pow的3个参数形式快速获得结果。 - DSM
2
当使用上标写时,顺序是显而易见的,但在这种表示法中,我没有意识到发生了什么。 - Elliot Gorokhovsky
1
pow(7, 282429536481, 25) - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接