E.g., I have:
def readDb():
# Fetch a lot of data from db, spends a lot time
...
return aList
def calculation():
x = readdb()
# Process x
...
return y
In the python interpreter,
each time I run calculation()
it takes a lot of time to re-read the database, which is unnecessary.
How can I store the result from readdb()
to avoid this reducdant process?
Edit:
I found a similar question here but I don't quite know the answer
Save functions for re-using without re-execution
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)
This will only hit the database once.
Basically, you want to save the results of readDb() to a seperate variable which you can then pass to calculation().
Write a simple decorator:
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
For more general solutions, look here: http://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/.
Updated answer for modern Python
For anyone still searching for how to do this, the standard library functools
includes a decorator function @functools.lru_cache
to do this.
For example (from the docs):
@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'
This would store the last 32
calls to get_pep
and when it is called with the same argument, the cached value will be returned.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With