速度差实际上大于3倍,但是您首先通过创建一个巨大的内存列表(一百万个整数)来降低这两个版本的速度。将其与时间试用分开:
>>> import timeit>>> def sum1(lst):... s = 0... for i in lst:... s += i... return s... >>> def sum2(lst):... return sum(lst)... >>> values = range(1000000)>>> timeit.timeit('f(lst)', 'from __main__ import sum1 as f, values as lst', number=100)3.457869052886963>>> timeit.timeit('f(lst)', 'from __main__ import sum2 as f, values as lst', number=100)0.6696369647979736现在,速度差已超过5倍。
甲
for环所解释的Python字节码执行。
sum()完全以C代码循环。解释的字节码和C代码之间的速度差异很大。
另外,如果C代码可以将总和保留在C类型中,则确保不创建新的Python对象;这适用于
int和
float结果。
反汇编的Python版本执行以下操作:
>>> import dis>>> def sum1():... s = 0... for i in range(1000000):... s += i... return s... >>> dis.dis(sum1) 20 LOAD_ConST 1 (0) 3 STORE_FAST 0 (s) 36 SETUP_LOOP 30 (to 39) 9 LOAD_GLOBAL 0 (range) 12 LOAD_ConST 2 (1000000) 15 CALL_FUNCTION 1 18 GET_ITER >> 19 FOR_ITER 16 (to 38) 22 STORE_FAST 1 (i) 4 25 LOAD_FAST 0 (s) 28 LOAD_FAST 1 (i) 31 INPLACE_ADD32 STORE_FAST 0 (s) 35 JUMP_ABSOLUTE19 >> 38 POP_BLOCK 5 >> 39 LOAD_FAST 0 (s) 42 RETURN_VALUE
除了解释器循环慢于C之外,
INPLACE_ADD还会创建一个新的整数对象(过去255,CPython将小
int对象缓存为单例)。
您可以在Python
mercurial代码存储库中看到C实现,但是它在注释中明确指出:



