2016-08-05 3 views
0

Скажем у меня есть этот метод, который я кэшировать с помощью 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(..., но в более сложном сценарии, который, вероятно, не представляется возможным.

Вопрос: Можно ли проверять, какие номера хранятся в кеше, и заказывать звонки на основе этого? Какими были бы накладные расходы на это?

ответ

1

Нет, нет, cache, используемый в lru, специально разработан, чтобы не быть открытым. Все его внутренности are encapsulated для обеспечения безопасности потоков и для того, чтобы не нарушить код, если реализация изменится.

Помимо этого, я не думаю, что это хорошая идея, чтобы основывать свой вход на основе кеширования, вы должны кэшировать на основе вашего ввода. Если вызываемый вызов периодически не вызывается с теми же аргументами, возможно, кеш не самый лучший вариант.

+0

Спасибо за ответ. Я понимаю, что это против философии lru_cache. Я думаю, что это скорее проблема оптимизации в моем случае: столкнулась с этой проблемой, когда я обнаружил, что я неоднократно вызывал метод с помощью только немного более разных аргументов, тогда мой maxsize и внезапный кэш больше не использовался вообще. Вероятно, это будет уменьшаться. –

Смежные вопросы