2016-08-29 8 views
0

の私は、次のコードを持っています。操作PythonのLRUキャッシュ

self.weighted_returns()を1回または2回計算するか?

+0

ここであなたが何を求めているのか分かりません。あなたは 'lru_cache'が何をしているのか知っていますか?もしそうなら、あなたは何について混乱していますか? –

+0

なぜlru_cacheをこれに使用していて、なぜ計算をインスタンス自体にキャッシュしないのですか? –

+0

なぜ2回呼び出されるべきかわかりません。同じ行にありますが、呼び出しは厳密な順序で評価されます。 – janbrohl

答えて

0

これにはfunctools.lru_cacheを使用できます。しかし、selfの計算だけをキャッシュしていて、その関数が引数を使用していない場合、それは過剰です。次に、あなたの計算は次のようになり

@reify 
def weighted_returns(self): 
    # calculate the returns using self normally 
    return returns 

むしろ、私はピラミッドから怠惰reifyデコレータ盗みたい:

class reify(object): 
    def __init__(self, wrapped): 
     self.wrapped = wrapped 
     update_wrapper(self, wrapped) 

    def __get__(self, inst, objtype=None): 
     if inst is None: 
      return self 
     val = self.wrapped(inst) 
     setattr(inst, self.wrapped.__name__, val) 
     return val 

をそしてweighted_returns上でそれを使用し、遅延して計算属性にそれを回します

self.weighted_returns/self.weighted_returns.std() * np.sqrt(252) 

(paren )。

functools.lru_cache(maxsize=None)は、プログラムを強制終了するまでサイズが大きくなる無制限の辞書を保持しますが、reifyデコレータは、計算結果をインスタンス自体にキャッシュします。インスタンスがガベージコレクトされている場合は、そのキャッシュされた加重が返されます。