functools中lru缓存的用法

时间:2016-04-18 02:04:58

标签: python lru functools

我想在我的代码中使用lru_cache,但是,我收到此错误:

NameError: name 'lru_cache' is not defined

我的代码中有一个导入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)

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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):

答案 2 :(得分:1)

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

from functools import lru_cache

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

@functools.lru_cache(maxsize=None)

答案 3 :(得分:1)

另一点according to documentation是:

  

如果maxsize设置为None,则禁用LRU功能并缓存   可以无限地成长。当maxsize为   二次幂。

文档示例

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)

答案 4 :(得分:0)

如果您试图将LRU高速缓存用于异步功能,它将无法正常工作。尝试async-cache。它在python中支持异步类型的函数,您也可以将用户定义的数据类型与原始数据类型一起用作缓存函数中的参数。 functools.lru_cache

不支持此功能。