2016-08-29 87 views
0

的操作我有下面的代码:Python的LRU缓存

def sharpe(self): 
    return (self.weighted_returns()/self.weighted_returns().std())*np.sqrt(252) 

self.weighted_returns()@lru_cache(maxsize=None)装饰。

self.weighted_returns()计算一次还是两次?

+0

我不确定你在问什么。你知道'lru_cache'的功能吗?如果是这样你对什么感到困惑? –

+0

为什么你甚至为此使用lru_cache,为什么不把计算缓存到实例本身呢? –

+0

我看不出为什么它应该被调用两次。它是在同一条线上,但呼叫是按照严格的顺序进行评估的。 – janbrohl

回答

0

您可以使用functools.lru_cache。但是如果你只缓存self的计算,并且该函数不使用参数,那么这是一种矫枉过正的行为。

相反,我会从金字塔偷懒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,把它变成一个懒洋洋地计算属性:

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

然后你的计算会

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

(注意缺乏paren论文)。

functools.lru_cache(maxsize=None)不同,它会保留一个无限大小的字典(在杀死程序之前它会增加大小),reify装饰器将计算结果缓存到实例本身。如果实例是垃圾收集的,那么它的缓存加权回报也是如此。