为什么 list(range) 比 [i for i in range()] 快?
为什么 list(range) 比 [i for i in range()] 快?
t0 = time.time()
list(range(100000))
print(time.time()-t0)
>>> 0.00400090217590332
t0 = time.time()
[i for i in range(100000)]
print(time.time()-t0)
>>> 0.009000301361083984
理解 list()
和列表表达式之间的性能差异的关键在于反汇编:
import dis
N = 10000
def m1():
return list(range(N))
def m2():
return [i for i in range(N)]
dis.dis(m1)
dis.dis(m2)
m1
输出的反汇编:
8 0 LOAD_GLOBAL 0 (list)
3 LOAD_GLOBAL 1 (range)
6 LOAD_GLOBAL 2 (N)
9 CALL_FUNCTION 1
12 CALL_FUNCTION 1
15 RETURN_VALUE
如反汇编所示,整个转换只是一个字节码指令,该指令是对该list
方法的函数调用,而且整个实现list
均在C中进行。
另一方面,m2
的反汇编:
11 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (range)
6 LOAD_GLOBAL 1 (N)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_FAST 0 (i)
19 LOAD_FAST 0 (i)
22 LIST_APPEND 2
25 JUMP_ABSOLUTE 13
>> 28 RETURN_VALUE
如反汇编所示,列表表达式比list(range(N))
复杂得多,列表表达式的循环发生在多个字节码指令上。编译器循环的解析指令,增加了运行时间。
原内容参见: