Скажем у меня есть этот метод, который я кэшировать с помощью lru_cache
:Python lru_cache оптимизации использования
@lru_cache(maxsize=8)
def very_expensive_call(number):
# do something that's very expensive
return number
Я называю этот метод так:
print([very_expensive_call(i) for i in range(10)]) # call_1
Поскольку MAXSIZE из кэша 8, только номера 2-9 кэшируются в этой точке.
После call_1, я делаю call_2:
print([very_expensive_call(i) for i in range(10)]) # call_2
Во call_2, снова первый номер 0
называется (не в кэше!), А после этого числа 0 и 3-9 кэшируются. Затем номер 1
вызывается (не в кеше!), После чего числа 0-1 и 4-9 кэшируются. Ну, вы видите, где это происходит: кэш никогда не используется ...
Я понимаю, что для этого конкретного примера я мог бы чередовать между range(...
и reverse(range(...
, но в более сложном сценарии, который, вероятно, не представляется возможным.
Вопрос: Можно ли проверять, какие номера хранятся в кеше, и заказывать звонки на основе этого? Какими были бы накладные расходы на это?
Спасибо за ответ. Я понимаю, что это против философии lru_cache. Я думаю, что это скорее проблема оптимизации в моем случае: столкнулась с этой проблемой, когда я обнаружил, что я неоднократно вызывал метод с помощью только немного более разных аргументов, тогда мой maxsize и внезапный кэш больше не использовался вообще. Вероятно, это будет уменьшаться. –