您可以使用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
装饰器将计算结果缓存到实例本身。如果实例是垃圾收集的,那么它的缓存加权回报也是如此。
我不确定你在问什么。你知道'lru_cache'的功能吗?如果是这样你对什么感到困惑? –
为什么你甚至为此使用lru_cache,为什么不把计算缓存到实例本身呢? –
我看不出为什么它应该被调用两次。它是在同一条线上,但呼叫是按照严格的顺序进行评估的。 – janbrohl