我想在我的代码中使用lru_cache,但是,我得到了这个错误:
NameError: name 'lru_cache' is not defined
我的代码中确实有一个导入函数工具,但这对没有帮助
示例代码在这里:
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)
如果你真的只是写了import functools
,那么这还不够。您需要使用from functools import lru_cache
导入lru_cache
符号,或者在尝试使用名称时需要限定名称,如@functools.lru_cache
。
functools模块在这方面没有什么特别之处所有模块都是这样工作的。当您导入其他模块并使用其他函数时,您可能已经注意到了这一点。
使用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):
问题中不包括导入行,但它应该是:
from functools import lru_cache
或者,可以将函数装饰器更改为:
@functools.lru_cache(maxsize=None)
根据文档,另一个次要点是:
如果maxsize设置为None,LRU功能将被禁用,缓存可以不受约束地生长。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)
如果您试图将LRU缓存用于异步功能,它将不起作用。尝试异步缓存。它支持python中的异步类型函数。您还可以在缓存函数中使用用户定义的数据类型和基元数据类型作为参数。这在functools.ru_cache 中不受支持