How to store the result of an executed function and re-use later?

后端 未结 3 1508
悲哀的现实
悲哀的现实 2021-01-19 03:16

E.g., I have:

def readDb():
    # Fetch a lot of data from db, spends a lot time
    ...
    return aList

def calculation():
    x = readdb()
    # Process          


        
相关标签:
3条回答
  • 2021-01-19 03:33

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

    0 讨论(0)
  • 2021-01-19 03:41
    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().

    0 讨论(0)
  • 2021-01-19 03:46

    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.

    0 讨论(0)
提交回复
热议问题