Existe-t-il une bibliothèque de mise en cache Python?

Je cherche une bibliothèque de mise en cache Python mais je ne trouve rien jusqu’ici. J’ai besoin d’une interface simple de type dict où je peux définir les clés et leur expiration et les récupérer en cache. Sorte de quelque chose comme:

 cache.get(myfunction, duration=300) 

qui me donnera l’élément du cache s’il existe ou appelle la fonction et la stocke si elle n’existe pas ou a expiré. Est-ce que quelqu’un sait quelque chose comme ça?

Jetez un oeil à Beaker:

  • Page d’accueil
  • Documentation de mise en cache
  • Bon article sur l’utilisation de Beaker avec Django (mais utile dans d’autres applications également)

A partir de Python 3.2, vous pouvez utiliser le décorateur @lru_cache de la bibliothèque functools. C’est un cache utilisé récemment, il n’y a donc pas de délai d’expiration pour ces éléments, mais en tant que hack rapide, c’est très utile.

 from functools import lru_cache @lru_cache(maxsize=256) def f(x): return x*x for x in range(20): print f(x) for x in range(20): print f(x) 

Vous pouvez également jeter un coup d’œil au décorateur Memoize . Vous pourriez probablement le faire faire ce que vous voulez sans trop de modifications.

Joblib http://packages.python.org/joblib/ prend en charge les fonctions de mise en cache dans le modèle Memoize. La plupart du temps, l’idée est de mettre en cache des fonctions coûteuses en calcul.

 >>> from joblib import Memory >>> mem = Memory(cachedir='/tmp/joblib') >>> import numpy as np >>> square = mem.cache(np.square) >>> >>> a = np.vander(np.arange(3)).astype(np.float) >>> b = square(a) ________________________________________________________________________________ [Memory] Calling square... square(array([[ 0., 0., 1.], [ 1., 1., 1.], [ 4., 2., 1.]])) ___________________________________________________________square - 0...s, 0.0min >>> c = square(a) 

Vous pouvez aussi faire des choses fantaisistes comme utiliser le décorateur @ memory.cache sur les fonctions. La documentation est ici: http://packages.python.org/joblib/memory.html

Personne n’a encore mentionné le rangement. https://docs.python.org/2/library/shelve.html

Il n’est pas enregistré, mais semble beaucoup plus simple et pourrait répondre à vos besoins.

Je pense que l’API python memcached est l’outil le plus répandu, mais je ne l’ai pas utilisé moi-même et je ne suis pas sûr qu’elle prenne en charge les fonctionnalités dont vous avez besoin.

 import time class CachedItem(object): def __init__(self, key, value, duration=60): self.key = key self.value = value self.duration = duration self.timeStamp = time.time() def __repr__(self): return '' % (self.key, self.value, time.time() + self.duration) class CachedDict(dict): def get(self, key, fn, duration): if key not in self \ or self[key].timeStamp + self[key].duration < time.time(): print 'adding new value' o = fn(key) self[key] = CachedItem(key, o, duration) else: print 'loading from cache' return self[key].value if __name__ == '__main__': fn = lambda key: 'value of %s is None' % key ci = CachedItem('a', 12) print ci cd = CachedDict() print cd.get('a', fn, 5) time.sleep(2) print cd.get('a', fn, 6) print cd.get('b', fn, 6) time.sleep(2) print cd.get('a', fn, 7) print cd.get('b', fn, 7) 

Essayez redis, c’est l’une des solutions les plus propres et les plus simples pour que les applications partagent des données de manière atomique ou si vous avez une plateforme de serveur Web. C’est très facile à installer, vous aurez besoin d’un client python redis http://pypi.python.org/pypi/redis

Vous pouvez utiliser ma solution simple au problème. C’est vraiment simple, rien d’extraordinaire:

 class MemCache(dict): def __init__(self, fn): dict.__init__(self) self.__fn = fn def __getitem__(self, item): if item not in self: dict.__setitem__(self, item, self.__fn(item)) return dict.__getitem__(self, item) mc = MemCache(lambda x: x*x) for x in xrange(10): print mc[x] for x in xrange(10): print mc[x] 

Il manque en effet une fonctionnalité d’expiration, mais vous pouvez facilement l’étendre en spécifiant une règle particulière dans MemCache c-tor.

J’espère que le code est suffisamment explicite, mais si ce n’est pas le cas, le cache passe une fonction de traduction comme l’un de ses parameters. Il est utilisé à son tour pour générer une sortie en cache concernant l’entrée.

J’espère que cela aide

Regardez gocept.cache

Regardez bda.cache http://pypi.python.org/pypi/bda.cache – utilise ZCA et est testé avec zope et bfg.

keyring est la meilleure bibliothèque de mise en cache Python. Vous pouvez utiliser

 keyring.set_password("service","jsonkey",json_res) json_res= keyring.get_password("service","jsonkey") json_res= keyring.core.delete_password("service","jsonkey")