Есть ли разница в производительности между кэшированием с использованием @lru_cache(maxsize=None)
из Python 3.7 functools
и простым хранением его в dict
в экземпляре?
Какой рекомендуемый подход?
Пример кода
from functools import lru_cache
import time
class Db:
@classmethod
def get_animal(cls, name):
print(f'Querying database for {name}...')
time.sleep(3) # simulate expensive DB call
return {'name': name, 'data': hash(name)}
class Zoo:
animals = {}
def get_animal(self, name):
if name not in self.animals:
self.animals[name] = Db.get_animal(name)
return self.animals[name]
@lru_cache(maxsize=None)
def get_animal_alt(self, name):
return Db.get_animal(name)
zoo = Zoo()
print(zoo.get_animal('dragon'))
print(zoo.get_animal('dragon'))
print(zoo.get_animal_alt('lion'))
print(zoo.get_animal_alt('lion'))
Вывод
Запрос базы данных для дракона ...
{'имя ':' дракон ',' данные ': 6700266117116448468}
{' имя ':' дракон ',' данные ': 6700266117116448468}
Запрос базы данных для льва ...
{'name': 'lion', 'data': 1221476345714202007}
{'name': 'lion', 'data': 1221476345714202007}