最佳答案
如何在类内部使用 functools.lru_cache
而不泄漏内存?
在下面的最小示例中,foo
实例将不会被释放,尽管超出了作用域并且没有引用程序(除了 lru_cache
)。
from functools import lru_cache
class BigClass:
pass
class Foo:
def __init__(self):
self.big = BigClass()
@lru_cache(maxsize=16)
def cached_method(self, x):
return x + 5
def fun():
foo = Foo()
print(foo.cached_method(10))
print(foo.cached_method(10)) # use cache
return 'something'
fun()
但是 foo
和 foo.big
(BigClass
)仍然活着
import gc; gc.collect() # collect garbage
len([obj for obj in gc.get_objects() if isinstance(obj, Foo)]) # is 1
这意味着 Foo
/BigClass
实例仍然驻留在内存中,即使删除 Foo
(del Foo
)也不会释放它们。
lru_cache
到底为什么要保留这个实例呢?缓存不是使用一些散列而不是实际的对象吗?
在类中使用 lru_cache
的推荐方法是什么?