为什么for循环的效率比列表推导低?
for循环版本
dis.dis('for i in array: a.append(i+1)')
1 0 SETUP_LOOP 26 (to 28)
2 LOAD_NAME 0 (array)
4 GET_ITER
>> 6 FOR_ITER 18 (to 26)
8 STORE_NAME 1 (i)
10 LOAD_NAME 2 (a)
12 LOAD_ATTR 3 (append)
14 LOAD_NAME 1 (i)
16 LOAD_CONST 0 (1)
18 BINARY_ADD
20 CALL_FUNCTION 1
22 POP_TOP
24 JUMP_ABSOLUTE 6
>> 26 POP_BLOCK
>> 28 LOAD_CONST 1 (None)
30 RETURN_VALUE
列表推导式版本
dis.dis('[x+1 for x in array]')
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x00000163C9D04C00, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (array)
8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
上面已经从本质说明了为什么会这样(大致可以体现)
下面我们从具体表现来看:
#循环
array=range(1000)
a=[]
%timeit for i in array: a.append(i+1)
79.5 µs ± 2.83 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
#列表推导
%timeit [x+1 for x in array]
34 µs ± 508 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
可以看出有两倍的差距
总结
列表推导属于python语法糖的一种
但我们也没有必要去讲究何时用何时不用。因为具体的速度还是不一定的 。并且,列表推导的目的只是为了生成列表,如果你想生成其他玩意,可以去研究生成器表达式。用于生成除了列表以外的序列