5

例:私は持っています:

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()

編集:
私はここで同様の質問を見つけましたが、答えがよくわかりません
再実行せずに再利用するための関数の保存

4

3 に答える 3

6
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)

これはデータベースに1回だけヒットします。

基本的に、readDb()の結果を別の変数に保存し、それをcalculation()に渡すことができます。

于 2013-03-19T15:56:55.123 に答える
5

簡単なデコレータを作成します。

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/を参照してください。

于 2013-03-19T15:58:30.980 に答える
1

最新の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'

32これにより、への最後の呼び出しが格納get_pepされ、同じ引数で呼び出されると、キャッシュされた値が返されます。

于 2018-08-17T11:00:32.237 に答える