functools中lru缓存的使用

Usage for lru cache in functools

我想在我的代码中使用 lru_cache,但是,我得到这个错误:

NameError: name 'lru_cache' is not defined

我的代码中确实有一个 import functools 但这没有帮助

示例代码在这里:

https://docs.python.org/3/library/functools.html

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

使用前需要导入lru_cache:

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

或者导入时用全名引用functools:

import functools

@functools.lru_cache(maxsize=None)
def fib(n):

如果你真的只写了import functools,那还不够。您需要使用 from functools import lru_cache 导入 lru_cache 符号,或者在尝试使用它时需要限定名称,例如 @functools.lru_cache.

functools 模块在这方面没有什么特别之处。 所有 模块都是这样工作的。当您导入其他模块并使用其他功能时,您可能已经注意到了。

问题中没有包含导入行,但应该是:

from functools import lru_cache

或者,函数装饰器可以更改为:

@functools.lru_cache(maxsize=None)

另一方面,according to documentation是:

If maxsize is set to None, the LRU feature is disabled and the cache can grow without bound. The LRU feature performs best when maxsize is a power-of-two.

文档示例

import functools
import urllib
import requests

    @functools.lru_cache(maxsize=32)
    def get_pep(num):
        'Retrieve text of a Python Enhancement Proposal'
        resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
        try:
            with urllib.request.urlopen(resource) as s:
                return s.read()
        except urllib.error.HTTPError:
            return 'Not Found'


    for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
        pep = get_pep(n)
        print(n, len(pep))

    print(get_pep.cache_info())

输出

8 106439
290 59766
308 56972
320 49551
8 106439
218 46795
320 49551
279 48553
289 50882
320 49551
9991 9
CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)

如果您尝试将 LRU 缓存用于异步函数,它将无法工作。尝试 async-cache 。它支持 python 中的异步类型函数,您还可以使用用户定义的数据类型以及原始数据类型作为缓存函数中的参数。这在 functools.lru_cache

中不受支持