Posts
装饰器
装饰器
记录了设计模式的装饰器
import functools, time
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
elaps = time.time() - start
name = func.__name__
arg_list = []
if args:
arg_list.append(', '.join(repr(arg) for arg in args))
if kwargs:
pairs = ['%s=%r' %(k, w) for k, w in sorted(kwargs.items())]
arg_list.append(', '.join(pairs))
arg_str = ', '.join(arg_list)
print('[%0.8fs] %s(%s) -> %r' %(elaps, name, arg_str, res))
return res
return wrapper
@functools.lru_cache()
@log
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
if __name__ == "__main__":
print(fibonacci(6))Output
lru_cache.py
python3 lru_cache.py[0.00000167s] fibonacci(1) -> 1
[0.00000310s] fibonacci(0) -> 0
[0.00025296s] fibonacci(2) -> 1
[0.00032377s] fibonacci(3) -> 2
[0.00042295s] fibonacci(4) -> 3
[0.00053787s] fibonacci(5) -> 5
[0.00070119s] fibonacci(6) -> 8
当注释掉21行的装饰器后,输出为
[0.00000095s] fibonacci(1) -> 1
[0.00000000s] fibonacci(0) -> 0
[0.00006604s] fibonacci(2) -> 1
[0.00000000s] fibonacci(1) -> 1
[0.00007701s] fibonacci(3) -> 2
[0.00000095s] fibonacci(1) -> 1
[0.00000095s] fibonacci(0) -> 0
[0.00001001s] fibonacci(2) -> 1
[0.00009704s] fibonacci(4) -> 3
[0.00000000s] fibonacci(1) -> 1
[0.00000000s] fibonacci(0) -> 0
[0.00000930s] fibonacci(2) -> 1
[0.00000000s] fibonacci(1) -> 1
[0.00001884s] fibonacci(3) -> 2
[0.00012589s] fibonacci(5) -> 5
[0.00000000s] fibonacci(1) -> 1
[0.00000000s] fibonacci(0) -> 0
[0.00000906s] fibonacci(2) -> 1
[0.00000095s] fibonacci(1) -> 1
[0.00001979s] fibonacci(3) -> 2
[0.00000095s] fibonacci(1) -> 1
[0.00000095s] fibonacci(0) -> 0
[0.00003409s] fibonacci(2) -> 1
[0.00008798s] fibonacci(4) -> 3
[0.00022793s] fibonacci(6) -> 8
省去了重复计算
Updated at