2016-10-26 2 views
1

У меня есть функции в python, у которых есть кеши с lru_cache, например.Очистить все lru_cache в Python

@lru_cache(maxsize=None) 
def my_function(): 
    ... 

Хотя я могу индивидуально очищать кеши, например. my_function.cache_clear() есть ли способ очистки кешей каждой функции сразу? [Я думал, что, возможно, есть способ вернуть все имена функций, загруженные в память, а затем зацикливать их, очищая кеш от каждого].

Я специально ищу для реализации как часть спада, для случаев, когда говорят, что 90% памяти на моей машине используется.

+0

Да, декорированная функция теперь имеет метод 'my_function.cache_clear()'. Вы также можете получить статистику с помощью 'my_function.cache_info()'. См. ['Lru_cache'] (https://docs.python.org/3.5/library/functools.html?highlight=lru#functools.lru_cache) – AChampion

+0

@AChampion - конечно, осознавая оба из этих вопросов, хотя это скорее есть способ применить эти методы к каждому украшенному функциям (т. е. очистить * все * lru_cache's). – kyrenia

+0

Нет, нет простого способа очистки всех украшенных кехов функций, все они независимы. Вы можете создать реестр всех этих функций, а затем пропустить их, чтобы очистить. – AChampion

ответ

1

Вы можете создать модифицированный декоратор, который также принимает к сведению кэшированных функций:

cached_functions = [] 

def clearable_lru_cache(*args, **kwargs): 
    def decorator(func): 
     func = lru_cache(*args, **kwargs)(func) 
     cached_functions.append(func) 
     return func 

    return decorator 

def clear_all_cached_functions(): 
    for func in cached_functions: 
     func.cache_clear() 

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

Тест:

@clearable_lru_cache() 
def foo(x): 
    print('foo', x) 

@clearable_lru_cache() 
def bar(x): 
    print('bar', x) 

for i in [1, 2]: 
    for j in [1, 2]: 
     print('Calling functions') 
     for k in [1, 2, 3]: 
      for f in [foo, bar]: 
       f(k) 
     print('Functions called - if you saw nothing they were cached') 
    print('Clearing cache') 
    clear_all_cached_functions() 

Выход:

Calling functions 
foo 1 
bar 1 
foo 2 
bar 2 
foo 3 
bar 3 
Functions called - if you saw nothing they were cached 
Calling functions 
Functions called - if you saw nothing they were cached 
Clearing cache 
Calling functions 
foo 1 
bar 1 
foo 2 
bar 2 
foo 3 
bar 3 
Functions called - if you saw nothing they were cached 
Calling functions 
Functions called - if you saw nothing they were cached 
Clearing cache