【发布时间】:2021-06-24 11:12:55
【问题描述】:
给定:
- 一组计算相互依赖的变量
- 从变量中选择的一组期望输出
我想:
- 只计算我需要的变量(惰性计算)
- 每个变量最多计算一次(缓存)
- 摆脱在输出或剩余输出的计算(垃圾收集)中不再需要的变量
- 奖励:对计算进行排序,以便可以首先删除要删除的最大变量,从而最大限度地减少内存使用量
例如:
a = 1
b = 2
c = b ** 10
d = a + b
在这个例子中:
- 如果
a是唯一需要的输出,则永远不需要计算b、c和d - 如果需要
c和d,那么b应该只计算一次 - 如果需要
c和d,则可以在计算出d后立即忘记a - 由于
a最终会被垃圾回收,我们尝试尽快安排,因此首先计算d(或者如果**操作会暂时占用更多内存,我们应该从c开始?对此不完全确定...)
在编写上述计算时,作为一个简单的语句序列,没有观察到属性 1 和 4。
同时,可以使用@property获取属性1和3(缺少2和4):
class DataGetter:
@property
def a(self): return 1
@property
def b(self): return 2
@property
def c(self): return self.b ** 10
@property
def d(self): return self.a + self.b
同样可以使用@cached_property获取属性1和2(缺少3和4):
class DataGetter:
@cached_property
def a(self): return 1
@cached_property
def b(self): return 2
@cached_property
def c(self): return self.b ** 10
@cached_property
def d(self): return self.a + self.b
有没有办法确保前 3 个属性都得到满足? (可能还有第四个?)
【问题讨论】: