通过传递任何发送进来的参数来支持具有任意参数的任意函数:
def tracer(func, *pargs, **kargs):
print('calling:', func.__name__)
return func(*pargs, **kargs)
def func(a, b, c, d):
return a + b + c + d
print(tracer(func, 1, 2, c=3, d=4))
tracer收集参数,然后以varargs调用语法来传递它。
返回结果:
('calling:', 'func')
10
对模块计时:
#File 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)
计时脚本:
#file 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 test in (forLoop, listComp, mapCall, genExpr, genFunc):
elapsed, result = mytimer.timer(test)
print ('-' * 33)
print ('%-9s: %.5f => [%s...%s]' %
(test.__name__, elapsed, result[0], result[-1]))
返回结果:
2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
---------------------------------
forLoop : 1.60391 => [10...10009]
---------------------------------
listComp : 0.77515 => [10...10009]
---------------------------------
mapCall : 1.73903 => [10...10009]
---------------------------------
genExpr : 1.18348 => [10...10009]
---------------------------------
genFunc : 1.14585 => [10...10009]