Skip to content

Commit f5743af

Browse files
committed
Cache calculated values
1 parent dbc2993 commit f5743af

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

eos/utils/stats.py

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,56 +61,101 @@ def __init__(self, em, thermal, kinetic, explosive):
6161
self._kinetic = kinetic
6262
self._explosive = explosive
6363
self._breachers = defaultdict(lambda: [])
64-
self.profile = None
65-
66-
def add_breacher(self, key, data):
67-
self._breachers[key].append(data)
64+
self.__profile = None
65+
# Cached data
66+
self.__cached_em = None
67+
self.__cached_thermal = None
68+
self.__cached_kinetic = None
69+
self.__cached_explosive = None
70+
self.__cached_pure = None
71+
self.__cached_total = None
6872

6973
@classmethod
7074
def default(cls):
7175
return cls(0, 0, 0, 0)
7276

77+
def _clear_cached(self):
78+
self.__cached_em = None
79+
self.__cached_thermal = None
80+
self.__cached_kinetic = None
81+
self.__cached_explosive = None
82+
self.__cached_pure = None
83+
self.__cached_total = None
84+
85+
def add_breacher(self, key, data):
86+
self._breachers[key].append(data)
87+
88+
@property
89+
def profile(self):
90+
return self.__profile
91+
92+
@profile.setter
93+
def profile(self, profile):
94+
self.__profile = profile
95+
self._clear_cached()
96+
7397
@property
7498
def em(self):
99+
if self.__cached_em is not None:
100+
return self.__cached_em
75101
dmg = self._em
76102
if self.profile is not None:
77103
dmg *= 1 - getattr(self.profile, "emAmount", 0)
104+
self.__cached_em = dmg
78105
return dmg
79106

80107
@property
81108
def thermal(self):
109+
if self.__cached_thermal is not None:
110+
return self.__cached_thermal
82111
dmg = self._thermal
83112
if self.profile is not None:
84113
dmg *= 1 - getattr(self.profile, "thermalAmount", 0)
114+
self.__cached_thermal = dmg
85115
return dmg
86116

87117
@property
88118
def kinetic(self):
119+
if self.__cached_kinetic is not None:
120+
return self.__cached_kinetic
89121
dmg = self._kinetic
90122
if self.profile is not None:
91123
dmg *= 1 - getattr(self.profile, "kineticAmount", 0)
124+
self.__cached_kinetic = dmg
92125
return dmg
93126

94127
@property
95128
def explosive(self):
129+
if self.__cached_explosive is not None:
130+
return self.__cached_explosive
96131
dmg = self._explosive
97132
if self.profile is not None:
98133
dmg *= 1 - getattr(self.profile, "explosiveAmount", 0)
134+
self.__cached_explosive = dmg
99135
return dmg
100136

101137
@property
102138
def pure(self):
139+
if self.__cached_pure is not None:
140+
return self.__cached_pure
103141
if self.profile is None:
104-
return sum(
142+
dmg = sum(
105143
max((b.absolute for b in bs), default=0)
106144
for bs in self._breachers.values())
107-
return sum(
108-
max((min(b.absolute, b.relative * getattr(self.profile, "hp", math.inf)) for b in bs), default=0)
109-
for bs in self._breachers.values())
145+
else:
146+
dmg = sum(
147+
max((min(b.absolute, b.relative * getattr(self.profile, "hp", math.inf)) for b in bs), default=0)
148+
for bs in self._breachers.values())
149+
self.__cached_pure = dmg
150+
return dmg
110151

111152
@property
112153
def total(self):
113-
return self.em + self.thermal + self.kinetic + self.explosive + self.pure
154+
if self.__cached_total is not None:
155+
return self.__cached_total
156+
dmg = self.em + self.thermal + self.kinetic + self.explosive + self.pure
157+
self.__cached_total = dmg
158+
return dmg
114159

115160
# Iterator is needed to support tuple-style unpacking
116161
def __iter__(self):
@@ -154,6 +199,7 @@ def __iadd__(self, other):
154199
self._explosive += other._explosive
155200
for k, v in other._breachers.items():
156201
self._breachers[k].extend(v)
202+
self._clear_cached()
157203
return self
158204

159205
def __mul__(self, mul):
@@ -177,6 +223,7 @@ def __imul__(self, mul):
177223
for v in self._breachers.values():
178224
for b in v:
179225
b *= mul
226+
self._clear_cached()
180227
return self
181228

182229
def __truediv__(self, div):

graphs/data/fitDamageStats/cache/time.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ def addDmg(ddKey, addedTime, addedDmg):
171171
if addedDmg.total == 0:
172172
return
173173
addedDmg._breachers = {addedTime + k: v for k, v in addedDmg._breachers.items()}
174+
addedDmg._clear_cached()
174175
intCacheDmg.setdefault(ddKey, {})[addedTime] = addedDmg
175176

176177
# Modules

0 commit comments

Comments
 (0)