functools中lru cache的用法

8

我想在我的代码中使用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)
5个回答

18
如果您只写了import functools,那样是不够的。您需要通过from functools import lru_cache导入lru_cache符号,或者在使用时限定名称,例如@functools.lru_cache
在这方面,所有模块都是如此。您可能已经注意到当您导入其他模块并使用其他函数时会发生类似的情况。

7

在使用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):

在同一个文件中,我们可以将@functools.lru_cache(maxsize=32)用于多个函数吗? - Mayur

2

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

from functools import lru_cache

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

@functools.lru_cache(maxsize=None)

我们可以在同一个文件中为多个函数使用@functools.lru_cache(maxsize=32)吗? - Mayur

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)

1
我们可以在同一个文件中多个函数中使用@functools.lru_cache(maxsize=32)吗? - Mayur

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接