Python解释器正在预计算floor中的循环内的表达式,而不是在normal中。在
下面是楼层代码:>>> dis.dis(floor)
5 0 SETUP_LOOP 24 (to 27)
3 LOAD_GLOBAL 0 (xrange)
6 LOAD_CONST 9 (10000000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 10 (to 26)
16 STORE_FAST 0 (_)
6 19 LOAD_CONST 15 (-234)
22 POP_TOP
23 JUMP_ABSOLUTE 13
>> 26 POP_BLOCK
>> 27 LOAD_CONST 0 (None)
30 RETURN_VALUE
您可以看到表达式已经被计算LOAD_CONST 15 (-234)。在
以下是normal的相同内容:
^{pr2}$
这一次,计算只是部分简化(例如:省略了初始的1 *),并且大多数操作都是在运行时执行的。在
看起来Python2.7没有执行包含不明确的/运算符的常量折叠(这可能是整数或浮点除法,具体取决于它的操作数)。在程序顶部添加from __future__ import division会导致常量在normal中折叠,就像在floor中一样(当然,尽管结果不同,因为现在{}是浮点除法)。在normal
10 0 SETUP_LOOP 24 (to 27)
3 LOAD_GLOBAL 0 (xrange)
6 LOAD_CONST 9 (10000000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 10 (to 26)
16 STORE_FAST 0 (_)
11 19 LOAD_CONST 15 (-233.6370808678501)
22 POP_TOP
23 JUMP_ABSOLUTE 13
>> 26 POP_BLOCK
>> 27 LOAD_CONST 0 (None)
30 RETURN_VALUE
这并不是说解释器不能使用默认的/运算符进行常量折叠,但事实并非如此。也许代码是从python3后传过来的,因此使用不明确的除法运算符并不重要。在