Python 运算和分组的指数顺序
Python exponentiation order of operations and grouping
简单问题:
为什么 (7**3) ** 24 % 25
几乎没有时间到 运行,但 7 ** 3 ** 24 % 25
却没有终止?
因此,7 ** 3 ** 24
被评估为 7 ** 282429536481
(困难),而 (7**3) ** 24
只是 343 ** 24
(简单)。
作为一个有趣的旁注:具有窥孔优化器的 CPython 能够通过不断折叠来优化 "easy" 情况。但是 "hard" 的情况只能折叠 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
简单问题:
为什么 (7**3) ** 24 % 25
几乎没有时间到 运行,但 7 ** 3 ** 24 % 25
却没有终止?
因此,7 ** 3 ** 24
被评估为 7 ** 282429536481
(困难),而 (7**3) ** 24
只是 343 ** 24
(简单)。
作为一个有趣的旁注:具有窥孔优化器的 CPython 能够通过不断折叠来优化 "easy" 情况。但是 "hard" 的情况只能折叠 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