使用functools.lru_cache装饰器··

装饰器

  • functools.lru_cache 装饰器

functools.lru_cache 是非常实用的装饰器,它实现了备忘功能。这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。LRU 三个字母是 “Least Recently Used" 的缩写,表明缓存不会无限制增长,一段时间不用的缓存条目会被扔掉。

例如: 计算斐波那契这种慢速递归函数。

import time
def clock(func):
    def clocked(*args):
        t0 = time.time()
        result = func(*args)
        elapsed = time.time() - t0
        name = func.__name__
        arg_str = ', '.join(repr(arg) for arg in args)
        print('[%0.8fs] %s(%s) -> %r' % (elapsed, name, arg_str, result))
        return result
    return clocked

from clockdeco import clock
from functools import lru_cache
# 叠放装饰器 相当于: fibonacci = lru_cache(clock(fibonacci))
@lru_cache()
@clock
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2) + fibonacci(n-1)
if __name__ == '__main__':
    print(fibonacci(30))

## 结果:
[0.00000000s] fibonacci(0) -> 0
[0.00000000s] fibonacci(1) -> 1
[0.00000000s] fibonacci(2) -> 1
[0.00000000s] fibonacci(3) -> 2
...............
[0.00000000s] fibonacci(28) -> 317811
[0.00000000s] fibonacci(29) -> 514229
[0.00000000s] fibonacci(30) -> 832040
832040

在不使用装饰器时,上例计算fibonacci(30) 时调用函数2692537次,耗时约17秒。可以看到当使用装饰器时这个结果是瞬间完成,效果非常显著。

猜你喜欢

转载自blog.csdn.net/ZT7524/article/details/95774055
今日推荐