Python: ¿Cómo almacenar el resultado de una función ejecutada y reutilizarla más tarde?

Por ejemplo, tengo:

def readDb(): # Fetch a lot of data from db, spends a lot time ... return aList def calculation(): x = readdb() # Process x ... return y 

En el intérprete de python,
cada vez que ejecuto el calculation() lleva mucho tiempo volver a leer la base de datos, lo cual es innecesario.
¿Cómo puedo almacenar el resultado de readdb() para evitar este proceso reductor?

Editar:
Encontré una pregunta similar aquí pero no sé muy bien la respuesta
Guarda funciones para reutilizar sin volver a ejecutar.

 def readDb(): ... #Fetch a lot of data from db, spends a lot time return aList def calculation(data): x=data ...process x... return y data = readDb() calculation(data) calculation(data) calculation(data) 

Esto solo llegará a la base de datos una vez.

Básicamente, desea guardar los resultados de readDb () en una variable separada que luego puede pasar al cálculo ().

Escribe un decorador sencillo:

 class memo(object): def __init__(self, fun): self.fun = fun self.res = None def __call__(self): if self.res is None: self.res = self.fun() return self.res @memo def readDb(): # ... etc return aList 

Para obtener soluciones más generales, consulte aquí: http://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/ .

Respuesta actualizada para Python moderno

Para cualquier persona que todavía esté buscando cómo hacer esto, las functools estándar de la biblioteca incluyen una función decorator @functools.lru_cache para hacer esto.

Por ejemplo (de los documentos):

 @lru_cache(maxsize=32) def get_pep(num): 'Retrieve text of a Python Enhancement Proposal' resource = 'http://www.python.org/dev/peps/pep-%04d/' % num try: with urllib.request.urlopen(resource) as s: return s.read() except urllib.error.HTTPError: return 'Not Found' 

Esto almacenaría las últimas 32 llamadas a get_pep y cuando se llame con el mismo argumento, se devolverá el valor almacenado en caché.