info.py
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 768 行 · 第 1/2 页
PY
768 行
class VectorStat(Statistic,Vector): def __value__(self, run, item): if run not in self.data: return None return self.data[run][item][0] def __len__(self): return self.x def display(self, run=None): import display d = display.VectorDisplay() d.name = self.name d.desc = self.desc d.value = [ value(self, run, i) for i in xrange(len(self)) ] d.flags = self.flags d.precision = self.precision d.display()class Formula(Value): def __getattribute__(self, attr): if attr not in ( '__scalar__', '__vector__', '__value__', '__len__' ): return super(Formula, self).__getattribute__(attr) formula = re.sub(':', '__', self.formula) value = eval(formula, self.source.stattop) return getattr(value, attr) def __str__(self): return self.nameclass SimpleDist(Statistic): def __init__(self, sums, squares, samples): self.sums = sums self.squares = squares self.samples = samples def display(self, name, desc, flags, precision): import display p = display.Print() p.flags = flags p.precision = precision if self.samples > 0: p.name = name + ".mean" p.value = self.sums / self.samples p.display() p.name = name + ".stdev" if self.samples > 1: var = (self.samples * self.squares - self.sums ** 2) \ / (self.samples * (self.samples - 1)) if var >= 0: p.value = math.sqrt(var) else: p.value = 'NaN' else: p.value = 0.0 p.display() p.name = name + ".samples" p.value = self.samples p.display() def comparable(self, other): return True def __eq__(self, other): return self.sums == other.sums and self.squares == other.squares and \ self.samples == other.samples def __isub__(self, other): self.sums -= other.sums self.squares -= other.squares self.samples -= other.samples return self def __iadd__(self, other): self.sums += other.sums self.squares += other.squares self.samples += other.samples return self def __itruediv__(self, other): if not other: return self self.sums /= other self.squares /= other self.samples /= other return selfclass FullDist(SimpleDist): def __init__(self, sums, squares, samples, minval, maxval, under, vec, over, min, max, bsize, size): self.sums = sums self.squares = squares self.samples = samples self.minval = minval self.maxval = maxval self.under = under self.vec = vec self.over = over self.min = min self.max = max self.bsize = bsize self.size = size def display(self, name, desc, flags, precision): import display p = display.Print() p.flags = flags p.precision = precision p.name = name + '.min_val' p.value = self.minval p.display() p.name = name + '.max_val' p.value = self.maxval p.display() p.name = name + '.underflow' p.value = self.under p.display() i = self.min for val in self.vec[:-1]: p.name = name + '[%d:%d]' % (i, i + self.bsize - 1) p.value = val p.display() i += self.bsize p.name = name + '[%d:%d]' % (i, self.max) p.value = self.vec[-1] p.display() p.name = name + '.overflow' p.value = self.over p.display() SimpleDist.display(self, name, desc, flags, precision) def comparable(self, other): return self.min == other.min and self.max == other.max and \ self.bsize == other.bsize and self.size == other.size def __eq__(self, other): return self.sums == other.sums and self.squares == other.squares and \ self.samples == other.samples def __isub__(self, other): self.sums -= other.sums self.squares -= other.squares self.samples -= other.samples if other.samples: self.minval = min(self.minval, other.minval) self.maxval = max(self.maxval, other.maxval) self.under -= under self.vec = map(lambda x,y: x - y, self.vec, other.vec) self.over -= over return self def __iadd__(self, other): if not self.samples and other.samples: self = other return self self.sums += other.sums self.squares += other.squares self.samples += other.samples if other.samples: self.minval = min(self.minval, other.minval) self.maxval = max(self.maxval, other.maxval) self.under += other.under self.vec = map(lambda x,y: x + y, self.vec, other.vec) self.over += other.over return self def __itruediv__(self, other): if not other: return self self.sums /= other self.squares /= other self.samples /= other if self.samples: self.under /= other for i in xrange(len(self.vec)): self.vec[i] /= other self.over /= other return selfclass Dist(Statistic): def display(self): import display if not display.all and not (self.flags & flags.printable): return self.dist.display(self.name, self.desc, self.flags, self.precision) def comparable(self, other): return self.name == other.name and \ self.dist.compareable(other.dist) def __eq__(self, other): return self.dist == other.dist def __isub__(self, other): self.dist -= other.dist return self def __iadd__(self, other): self.dist += other.dist return self def __itruediv__(self, other): if not other: return self self.dist /= other return selfclass VectorDist(Statistic): def display(self): import display if not display.all and not (self.flags & flags.printable): return if isinstance(self.dist, SimpleDist): return for dist,sn,sd,i in map(None, self.dist, self.subnames, self.subdescs, range(len(self.dist))): if len(sn) > 0: name = '%s.%s' % (self.name, sn) else: name = '%s[%d]' % (self.name, i) if len(sd) > 0: desc = sd else: desc = self.desc dist.display(name, desc, self.flags, self.precision) if (self.flags & flags.total) or 1: if isinstance(self.dist[0], SimpleDist): disttotal = SimpleDist( \ reduce(sums, [d.sums for d in self.dist]), reduce(sums, [d.squares for d in self.dist]), reduce(sums, [d.samples for d in self.dist])) else: disttotal = FullDist( \ reduce(sums, [d.sums for d in self.dist]), reduce(sums, [d.squares for d in self.dist]), reduce(sums, [d.samples for d in self.dist]), min([d.minval for d in self.dist]), max([d.maxval for d in self.dist]), reduce(sums, [d.under for d in self.dist]), reduce(sums, [d.vec for d in self.dist]), reduce(sums, [d.over for d in self.dist]), dist[0].min, dist[0].max, dist[0].bsize, dist[0].size) name = '%s.total' % (self.name) desc = self.desc disttotal.display(name, desc, self.flags, self.precision) def comparable(self, other): return self.name == other.name and \ alltrue(map(lambda x, y : x.comparable(y), self.dist, other.dist)) def __eq__(self, other): return alltrue(map(lambda x, y : x == y, self.dist, other.dist)) def __isub__(self, other): if isinstance(self.dist, (list, tuple)) and \ isinstance(other.dist, (list, tuple)): for sd,od in zip(self.dist, other.dist): sd -= od else: self.dist -= other.dist return self def __iadd__(self, other): if isinstance(self.dist, (list, tuple)) and \ isinstance(other.dist, (list, tuple)): for sd,od in zip(self.dist, other.dist): sd += od else: self.dist += other.dist return self def __itruediv__(self, other): if not other: return self if isinstance(self.dist, (list, tuple)): for dist in self.dist: dist /= other else: self.dist /= other return selfclass Vector2d(Statistic): def display(self): import display if not display.all and not (self.flags & flags.printable): return d = display.VectorDisplay() d.__dict__.update(self.__dict__) if self.__dict__.has_key('ysubnames'): ysubnames = list(self.ysubnames) slack = self.x - len(ysubnames) if slack > 0: ysubnames.extend(['']*slack) else: ysubnames = range(self.x) for x,sname in enumerate(ysubnames): o = x * self.y d.value = self.value[o:o+self.y] d.name = '%s[%s]' % (self.name, sname) d.display() if self.flags & flags.total: d.value = [] for y in range(self.y): xtot = 0.0 for x in range(self.x): xtot += self.value[y + x * self.x] d.value.append(xtot) d.name = self.name + '.total' d.display() def comparable(self, other): return self.name == other.name and self.x == other.x and \ self.y == other.y def __eq__(self, other): return True def __isub__(self, other): return self def __iadd__(self, other): return self def __itruediv__(self, other): if not other: return self return selfdef NewStat(source, data): stat = None if data.type == 'SCALAR': stat = ScalarStat() elif data.type == 'VECTOR': stat = VectorStat() elif data.type == 'DIST': stat = Dist() elif data.type == 'VECTORDIST': stat = VectorDist() elif data.type == 'VECTOR2D': stat = Vector2d() elif data.type == 'FORMULA': stat = Formula() stat.__dict__['source'] = source stat.__dict__['ticks'] = None stat.__dict__.update(data.__dict__) return stat
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?