您正在计时函数调用(test()),for循环和对range()的调用.增加的时间根本没有.
def test(n):
for i in range(n):
1 + 1
import dis
dis.dis(test)
这是测试函数的字节代码(不包括对test()的调用):
2 0 SETUP_LOOP 24 (to 27)
3 LOAD_GLOBAL 0 (range)
6 LOAD_FAST 0 (n)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 10 (to 26)
16 STORE_FAST 1 (i)
3 19 LOAD_CONST 2 (2) ****
22 POP_TOP
23 JUMP_ABSOLUTE 13
>> 26 POP_BLOCK
>> 27 LOAD_CONST 0 (None)
30 RETURN_VALUE
****注意,添加是在编译时完成的.相当多的其他语言及其编译器将会这样做,包括C.但是,标准很少定义何时实际执行11,因此它通常依赖于实现.
编辑:
你的timeit函数调用可能是这样的:
t = timeit("x += 1", setup="x = 1", number=100000)
我们可以创建一个虚函数来检查操作:
def myfunc(x):
x += 1
import dis
dis.dis(myfunc)
做出改变会给出:
1 additions takes 0.008976
2 additions takes 0.007419
4 additions takes 0.007282
8 additions takes 0.007693
16 additions takes 0.007026
32 additions takes 0.007793
64 additions takes 0.010168
128 additions takes 0.008124
256 additions takes 0.009064
512 additions takes 0.007256
1 addition takes -0.001557
1 addition takes -0.000068
1 addition takes 0.000103
1 addition takes -0.000083
1 addition takes 0.000048
1 addition takes 0.000074
1 addition takes -0.000032
1 addition takes 0.000007
26 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (1)
6 INPLACE_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
注意,x = 1是INPLACE_ADD,与x = x 1不同,它是BINARY_ADD.因此,您需要确定要测量的OPCode.