列表推导以Python字节码执行循环,就像常规
for循环一样。
该
list()调用完全在C代码中进行迭代,这要快得多。
列表理解的字节码如下所示:
>>> import dis>>> dis.dis(compile("[x for x in xrange(1000000)]", '<stdin>', 'exec')) 10 BUILD_LIST 0 3 LOAD_NAME 0 (xrange) 6 LOAD_ConST 0 (1000000) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 12 (to 28) 16 STORE_NAME 1 (x) 19 LOAD_NAME 1 (x) 22 LIST_APPEND 2 25 JUMP_ABSOLUTE13 >> 28 POP_TOP 29 LOAD_ConST 1 (None) 32 RETURN_VALUE该
>>指针大致给你执行循环的界限,让你有百万
STORE_NAME,
LOAD_NAME和
LIST_APPEND步骤在Python字节码估价循环执行。
list()另一方面,仅
xrange()使用C
API进行对象迭代即可直接从Iterable中获取值,并且它可以使用
xrange()对象的长度来预分配列表对象,而不是动态地对其进行增长。



