#python #caching #memoization
#python #кэширование #запоминание
Вопрос:
Я использую запоминание, чтобы ускорить использование сложной функции complexfunct()
. Эта функция принимает в качестве входных numpy.array
данных переменную размерность (она может хранить от 5 до 15 значений). Каждое значение numpy.array
принадлежит набору из 5 значений. Таким образом, количество разрешенных входных данных для my complexfunct()
довольно велико, запомнить их все невозможно. Вот почему, когда я запускаю свой jupyter notebook, он выходит из строя.
Функция запоминания, которую я использую, — это:
def memoize(func):
"""Store the results of the decorated function for fast lookup
"""
# Store results in a dict that maps arguments to results
cache = {}
def wrapper(*args, **kwargs):
key = str(args) str(kwargs)
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
Мой вопрос: могу ли я установить размер используемого кэша, чтобы, если он будет насыщен и новый ввод должен быть сохранен в кэше, он заменит первую запись — или, что лучше, наименее недавно использованную.
Спасибо всем в advanced.
Ответ №1:
если он переполнен и новый ввод должен быть сохранен в кэше, тогда он заменит первую запись — или, что лучше, наименее недавно использованную.
Учитывая, что вы заботитесь о порядке вставки, при принятии решения о том, что удалять, я предлагаю использовать коллекции.OrderedDict вместо dict
, т.е. добавить import collections
и заменить
cache = {}
используя
cache = collections.OrderedDict()
затем добавьте проверку после вставки, и если размер превышает лимит, просто сделайте:
cache.popitem(last=False)
чтобы удалить самую старую запись.
Комментарии:
1. Это может сделать работу за меня .. большое вам спасибо!