Функциональные инструменты Python lru_cache с методами экземпляра: объект выпускаPython

Программы на Python
Ответить
Anonymous
 Функциональные инструменты Python lru_cache с методами экземпляра: объект выпуска

Сообщение Anonymous »

Как я могу использовать 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
Это значит, что Фу/

Код: Выделить всё

BigClassЭкземпляры 
все еще находятся в памяти. Даже удаление Foo (del Foo) не освободит их.
Почему lru_cache вообще удерживает экземпляр? Разве кеш не использует какой-то хэш, а не сам объект?
Как рекомендуется использовать lru_cache внутри классов?
Я знаю два обходных пути:
Использовать кэши для каждого экземпляра или заставить кэш игнорировать объект (хотя это может привести к неверным результатам)


Подробнее здесь: https://stackoverflow.com/questions/336 ... ase-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»