参考html
import time def foo(): print 'this is foo' def timeit(func): start = time.clock() func() end = time.clock() print 'used time : ', (end-start) timeit(foo)
原本能够这样使用的,可是若是是这样使用的话,语义会出现问题;因此为了让咱们感受仍是在用foo这个方法;咱们能够这样设计;python
def timeit(func): def wrapper(): start= time.clock() func() end = time.clock() print 'used time', end-start return wrapper foo = timeit(foo)# 这个尚未执行 xxxxx行 foo()# 才刚开始执行 yyyy行
在python 中为了简化xxxx行就有一种叫语法糖(装饰器@)
的东西;能够直接在foo的方法定义前使用;编程
@timeit def foo(): ......
以上代码就是装饰模式的设计思想
,就是在原来的东西上装饰了一些东西,结果本质上仍是那个东西; 好比:一个白色的杯子,你只是给它刷了一层漆, 那么这个杯子仍是杯子,而不是变成其余物品;因此,foo 在代码书写
看来仍是 foo, 而不是变成timeit(foo);app
刚才我说了一个从代码上
看来,foo仍是foo, 其实从上面timeit(func)的实现来看,由于timeit返回的是一个wrapper方法,因此,foo本质上已经变成了wrapper了,那么怎么避免这点呢?因此python的提供了一个functools.wraps的装饰器;this
如重新定义timeit()设计
def timeit(func): @functools.wraps(func) def wrapper(): start = time.clock() func() end = time.clock() print 'used time', end-start return wrapper