对迭代的各种方法进行计时

列表解析要比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表现更好。

posted on 2018-04-07 17:26  11wayne  阅读(145)  评论(0)    收藏  举报

导航