defmy_func(): lis = [] for i inrange(9999999): lis.append(i) return lis defmy_func2(): return [i for i inrange(9999999)]
方法一、
最直接的,但这样改变了函数调用的方式,也不够优雅
1 2 3 4 5 6 7
deftimeit(func): s = time.time() res = func() e = time.time() print(f"Finished {func.__name__!r} in {e-s:.4f} secs") return res res = timeit(my_func)
方法二、
1 2 3 4 5 6 7 8 9 10
deftimeit(func): defwrapper(): s = time.time() res = func() e = time.time() print(f"Finished {func.__name__!r} in {e-s:.4f} secs") return res return wrapper my_func = timeit(my_func) res = my_func()
这样写很奇怪很啰嗦,但其实它等价于
1 2 3 4 5 6 7
@timeit defmy_func(): lis = [] for i inrange(9999999): lis.append(i) return lis res = my_func()
deftimeit(func): defwrapper(*args,**kwargs): #do something res = func(*args,**kwargs) #do something return res return wrapper @timeit defmy_func(name): returnf"My name is {name}"
classDecorator: def__init__(self,func): functools.update_wrapper(self, func) #不是@functools.wrapper self.func = func def__call__(self,*args,**kwargs): # do sth before res = self.func(*args,**kwargs) # do sth after return res @Decorator defmy_func(): ...
一些例子
模板
1 2 3 4 5 6 7 8 9 10
import functools
defdecorator(func): @functools.wraps(func) defwrapper(*args,**kwargs): # do sth res = func() # do sth return res return wrapper