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é.