Cri*_*lho 17 python performance list-comprehension list python-2.x
这是有趣的; list()强制迭代器获取实际列表比[x for x in someList](理解)快得多.
这是真的还是我的测试太简单了?以下是代码:
import time    
timer = time.clock()
for i in xrange(90):
    #localList = [x for x in xrange(1000000)]   #Very slow, took me 6.8s
    localList = list(xrange(1000000))           #Very fast, took me 0.9s
    print localList[999999] #make sure list is really evaluated.
print "Total time: ", time.clock() - timer
Mar*_*ers 17
list comprehension在Python字节码中执行循环,就像常规for循环一样.
该list()调用完全在C代码中迭代,这要快得多.
列表推导的字节码如下所示:
>>> import dis
>>> dis.dis(compile("[x for x in xrange(1000000)]", '<stdin>', 'exec'))
  1           0 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_ABSOLUTE           13
        >>   28 POP_TOP             
             29 LOAD_CONST               1 (None)
             32 RETURN_VALUE        
该>>指针大致给你执行循环的界限,让你有百万STORE_NAME,LOAD_NAME和LIST_APPEND步骤在Python字节码估价循环执行.
list()另一方面,xrange()通过使用C API进行对象迭代,直接从迭代中获取值,并且可以使用xrange()对象的长度来预分配列表对象,而不是动态增长它.