Python幂运算和分组顺序

问题描述:

简单问题: 为什么(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

指数群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