以下通過程序對迭代方法進行比較,
模塊1:mytimer.py
import time
reps=1000
repslist=range(reps)
def timer(func,*pargs,**kargs):
start=time.clock()
for i in repslist:
ret=func(*pargs,**kargs)
elapsed=time.clock()-start
return (elapsed,ret)
time2.py
import sys,mytimer
reps=10000
repslist=range(reps)
def forloop():
res=[]
for x in repslist:
res.append(abs(x))
return res
def listComp():
return [abs(x) for x in repslist]
#def mapCall(): #只認用於3.0版本。
# return list(map(abs,replist)) #
def genExpr():
return list(abs(x) for x in repslist)
def genFunc():
def gen():
for x in repslist:
yield abs(x)
return list(gen())
print(sys.version)
for test in (forloop,listComp,genExpr,genFunc):
elapsed,result=mytimer.timer(test)
print '-'*33
print '%-9s:%.5f==>[%s...%s]' % (test.__name__,elapsed,result[0],result[-1])
在2.7版本下
2.7.5 (default, Sep 16 2013, 23:16:52) [MSC v.1500 32 bit (Intel)]
---------------------------------
forloop :1.38339==>[0...9999]
---------------------------------
listComp :0.70408==>[0...9999]
---------------------------------
genExpr :0.90445==>[0...9999]
---------------------------------
genFunc :0.88582==>[0...9999]
當生成的列表較大時,優勢更加明顯,我這裏將生成999999個元素的列表,
2.7.5 (default, Sep 16 2013, 23:16:52) [MSC v.1500 32 bit (Intel)]
---------------------------------
forloop :147.95689==>[0...999998]
---------------------------------
listComp :88.12757==>[0...999998]
---------------------------------
genExpr :108.48967==>[0...999998]
---------------------------------
genFunc :105.21874==>[0...999998]