美文网首页
Python 使用 functools.lru_cache()

Python 使用 functools.lru_cache()

作者: eeert2 | 来源:发表于2020-05-05 09:47 被阅读0次

上一篇:闭包

functools.lru_cache(maxsize=128, typed=False)

该函数是一个装饰器,为函数提供缓存功能。在下次以相同参数调用时直接返回上一次的结果

例如生成第 n 个斐波纳契数这种慢速递归函数适合使用 lru_cache

import datetime

def fibonacci(n):
    """斐波那契函数"""
    if n < 2:
        return n
    return fibonacci(n - 2) + fibonacci(n - 1)


if __name__ == '__main__':
    print(fibonacci(34))  # 没有使用缓存,则需要几秒钟的时间

如果没有使用缓存,则需要几秒钟的时间,像下面这样使用缓存后,瞬间就可以计算出结果。

import datetime
from functools import lru_cache


@lru_cache(maxsize=300)
def fibonacci(n):
    """斐波那契函数"""
    if n < 2:
        return n
    return fibonacci(n - 2) + fibonacci(n - 1)

如果使用了lru_cache,计算用时被大大减少。这是因为我们在使用fibonacci递归函数时,会重复计算值。使用了lru_cache后,所有的重复计算只会执行一次。

注意事项
  • 缓存是按照第一个参数作为键。
from functools import lru_cache


@lru_cache(maxsize=100)
def my_sum(a, b):
    print('执行计算')
    return a + b


if __name__ == '__main__':
    t1 = my_sum(1, 2)
    print(t1)
    t2 = my_sum(1, 2)
    print(t2)
执行计算
3
3

上面的函数使用了lru_cache缓存,所以只打印一次执行计算

if __name__ == '__main__':
    t1 = my_sum(1, 2)
    print(t1)
    t2 = my_sum(2, 1)
    print(t2)

像下面这样,第一个参数改变了,所以需要重新缓存

执行计算
3
执行计算
3
  • 2.缓存实际是存储在字典中,所以只能第一个必须可哈希hash
from functools import lru_cache


@lru_cache(maxsize=100)
def list_sum(nums: list):
    return sum(nums)

上述函数无法使用缓存,会报错

TypeError: unhashable type: 'list'

相关文章

网友评论

      本文标题:Python 使用 functools.lru_cache()

      本文链接:https://www.haomeiwen.com/subject/uqdsghtx.html