【问题标题】:Python exponentiation order of operations and grouping运算和分组的Python求幂顺序
【发布时间】:2015-06-06 21:58:08
【问题描述】:

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

【问题讨论】:

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

标签: python time operators exponentiation


【解决方案1】:

求幂组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        

【讨论】:

  • OOOOOOOH 是的!这与常规数学中的相同。对不起,我很笨。
  • 是的,1.6910144928582986e+238680647722 相当大。 :-) 当然,如果我们只关心 mod 25,我们可以使用 pow 的 3 参数形式来快速得到结果。
  • 当它用上标写时,顺序很明显,但在这个符号中我没有意识到发生了什么。
  • pow(7, 282429536481, 25) :)
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 2011-06-11
  • 1970-01-01
  • 2019-08-30
  • 2017-06-06
  • 1970-01-01
  • 2011-11-03
  • 2021-08-23
相关资源
最近更新 更多