2016-10-26 1 views
1

J'ai des fonctions en python qui ont des caches avec lru_cache e.g.Effacer tout lru_cache en Python

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

Bien que je puisse effacer individuellement les caches avec par ex. my_function.cache_clear() est-il un moyen d'effacer les caches de chaque fonction à la fois? [Je pensais qu'il y avait peut-être un moyen de retourner tous les noms de fonctions chargés en mémoire, puis de les faire défiler en effaçant le cache de chacun].

Je cherche spécifiquement à mettre en œuvre dans le cadre d'un repli, pour les cas où, par exemple, 90% de la mémoire sur ma machine est utilisée.

+0

Oui, la fonction décorée a maintenant la méthode 'my_function.cache_clear()'. Vous pouvez également obtenir des statistiques avec 'my_function.cache_info()'. Voir ['lru_cache'] (https://docs.python.org/3.5/library/functools.html?highlight=lru#functools.lru_cache) – AChampion

+0

@AChampion - bien sûr, conscient de ces deux, la question est plutôt est il existe un moyen d'appliquer ces méthodes à toutes les fonctions décorées (c'est-à-dire effacer * tout * les lru_cache). – kyrenia

+0

Non, il n'y a pas de moyen simple pour effacer toutes les caches de fonctions décorées, elles sont toutes indépendantes. Vous pouvez créer un registre de toutes ces fonctions, puis les parcourir pour les effacer. – AChampion

Répondre

1

Vous pouvez créer un décorateur modifié qui prend également note des fonctions mises en cache:

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() 

Si vous voulez vraiment, vous pouvez également utiliser rapiéçage de singe pour remplacer le décorateur d'origine.

Test:

@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() 

Sortie:

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