对迭代的各种方法进行计时
列表解析要比for循环语句有速度方面的性能优势,而且map会依据调用方法的不同表现出更好或更差的性能。
下面是时间测试模块:
#mytimer.py import time, sys reps = 1000 repsist = range(reps) if sys.platform[:3] == 'win': timefunc = time.clock else: timefunc =time.time def trace(*args): pass def timer(func, *pargs, **kargs): _reps = kargs.pop('_reps', 1000) trace(func, pargs, kargs, _reps) repslist = range(_reps) start = timefunc() for i in repslist: ret = func(*pargs, **kargs) elapsed = timefunc() - start return(elapsed, ret) def best(func, *pargs, **kargs): _reps = kargs.pop('_reps', 50) best = 2 ** 32 for i in range(_reps): (time, ret) = timer(func, *pargs, _reps=20, **kargs) if time < best: best = time return(best, ret)
下面是不同方法完成相同任务的计时测试:
#timeseqs.py import sys, mytimer reps = 10000 repslist = range(reps) def forLoop(): res = [] for x in repslist: res.append(x + 10) return res def listComp(): return [x + 10 for x in repslist] def mapCall(): return list(map((lambda x: x +10), repslist)) def genExpr(): return list(x + 10 for x in repslist) def genFunc(): def gen(): for x in repslist: yield x +10 return list(gen()) print(sys.version) for tester in (mytimer.timer, mytimer.best): print('<%s>' % tester.__name__) for test in (forLoop, listComp, mapCall, genExpr, genFunc): elapsed, result = tester(test) print('-' * 35) print('%-9s: %.5f => [%s...%s]' % (test.__name__, elapsed, result[0], result[-1]))
测试结果:
3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] <timer> ----------------------------------- forLoop : 5.62379 => [10...10009] ----------------------------------- listComp : 2.20087 => [10...10009] ----------------------------------- mapCall : 5.24635 => [10...10009] ----------------------------------- genExpr : 2.87000 => [10...10009] ----------------------------------- genFunc : 2.71405 => [10...10009] <best> ----------------------------------- forLoop : 0.05769 => [10...10009] ----------------------------------- listComp : 0.03141 => [10...10009] ----------------------------------- mapCall : 0.05933 => [10...10009] ----------------------------------- genExpr : 0.06588 => [10...10009] ----------------------------------- genFunc : 0.06585 => [10...10009] Process finished with exit code 0
在相对性能方面,列表解析在大多数情况下表现最好。当使用内置函数时,map表现更好。
浙公网安备 33010602011771号