簡體   English   中英

如何存儲已執行函數的結果並在以后重用?

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

例如,我有:

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

def calculation():
    x = readdb()
    # Process x
    ...
    return y

在python解釋器中,
每次運行calculation() ,都需要花費大量時間來重新讀取數據庫,這是不必要的。
我如何存儲來自readdb()的結果以避免這種簡化過程?

編輯:
我在這里找到了類似的問題,但我不太清楚答案
保存功能以供重復使用而無需重新執行

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)

這只會打一次數據庫。

基本上,您希望將readDb()的結果保存到一個單獨的變量中,然后可以將其傳遞給Calculation()。

寫一個簡單的裝飾器:

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

有關更一般的解決方案,請參見此處: http : //code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/

更新了現代Python的答案

對於仍在尋找操作方法的任何人,標准庫functools包含一個裝飾器函數@functools.lru_cache來執行此操作。

例如(來自文檔):

@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'

這將存儲對get_pep的最后32調用,並且使用相同的參數調用它時,將返回緩存的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM