源地址:http://www.cnblogs.com/tuzkee/archive/2013/02/21/2920902.html
import time
def time_me(fn):
def _wrapper(*args, **kwargs):
start = time.clock()
fn(*args, **kwargs)
print "%s cost %s second"%(fn.__name__, time.clock() - start)
return _wrapper
#这个装饰器可以在方便地统计函数运行的耗时。用来分析脚本的性能是最好不过了。
#这样用:
@time_me
def test(x, y):
time.sleep(0.1)
@time_me
def test2(x):
time.sleep(0.2)
test(1, 2)
test2(2)
#输出:
#test cost 0.1001529524 second
#test2 cost 0.199968431742 second
另一个更高级一点的版本是:
import time
import functools
def time_me(info="used"):
def _time_me(fn):
@functools.wraps(fn)
def _wrapper(*args, **kwargs):
start = time.clock()
fn(*args, **kwargs)
print "%s %s %s"%(fn.__name__, info, time.clock() - start), "second"
return _wrapper
return _time_me
@time_me()
def test(x, y):
time.sleep(0.1)
@time_me("cost")
def test2(x):
time.sleep(0.2)
test(1, 2)
test2(2)
#输出:
#test used 0.0999263791237 second
#test2 cost 0.199644784554 second
高级版本相比第一个版本多了一个自带的参数。
上例中@修饰符的作用:
‘@’符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说@A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。
本质上讲,装饰符@类似于回调函数,把其它的函数(暂且称为目的参数)作为自己的入参,在目的函数执行前,执行一些自己的操作,比如:计数、打印一些提示信息等,然后返回目的函数。
因此,第一个版本就相当于执行:
time_me(test())
time_me(test2())
高级版本相当于执行:
time_me("info")(test())
time_me("cost")(test2())