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