3

我想在我的代码中使用 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)
4

5 回答 5

14

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

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

于 2016-04-18T02:17:14.223 回答
6

使用前需要导入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):
于 2016-04-18T02:15:40.687 回答
2

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

from functools import lru_cache

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

@functools.lru_cache(maxsize=None)
于 2016-04-18T02:17:16.203 回答
2

根据文档,另一个方面是:

如果 maxsize 设置为 None,则禁用 LRU 功能,并且缓存可以无限制地增长。当 maxsize 是 2 的幂时,LRU 功能表现最佳。

文档示例

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)
于 2019-10-20T13:47:01.187 回答
0

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

于 2020-04-27T11:55:10.517 回答