| 102 | |
| 103 | |
| 104 | class Measurement: |
| 105 | |
| 106 | def __init__(self, key, unit): |
| 107 | self.key = key |
| 108 | self.unit = unit |
| 109 | self.values = [] |
| 110 | self.average = 0 |
| 111 | self.count = 0 |
| 112 | self.M2 = 0 |
| 113 | self.min = float("inf") |
| 114 | self.max = -float("inf") |
| 115 | |
| 116 | def addValue(self, value): |
| 117 | try: |
| 118 | num_value = float(value) |
| 119 | self.values.append(num_value) |
| 120 | self.min = min(self.min, num_value) |
| 121 | self.max = max(self.max, num_value) |
| 122 | self.count = self.count + 1 |
| 123 | delta = num_value - self.average |
| 124 | self.average = self.average + delta / self.count |
| 125 | delta2 = num_value - self.average |
| 126 | self.M2 = self.M2 + delta * delta2 |
| 127 | except ValueError: |
| 128 | print("Ignoring non-numeric value", value) |
| 129 | |
| 130 | def status(self, widths): |
| 131 | return "{} {}: avg {} stddev {} ({} - {}) {}".format( |
| 132 | fmt_reps(self), |
| 133 | fmtS(self.key, widths.key), fmtN(self.average, widths.average), |
| 134 | fmtN(self.stddev(), widths.stddev), fmtN(self.min, widths.min), |
| 135 | fmtN(self.max, widths.max), fmtS(self.unit_string())) |
| 136 | |
| 137 | def result(self, widths): |
| 138 | return format_line(self.size(), self.key, fmt(self.average), |
| 139 | fmt(self.stddev()), fmt(self.min), |
| 140 | fmt(self.max), self.unit_string(), |
| 141 | widths) |
| 142 | |
| 143 | def unit_string(self): |
| 144 | if not self.unit: |
| 145 | return "" |
| 146 | return self.unit |
| 147 | |
| 148 | def variance(self): |
| 149 | if self.count < 2: |
| 150 | return float('NaN') |
| 151 | return self.M2 / (self.count - 1) |
| 152 | |
| 153 | def stddev(self): |
| 154 | return math.sqrt(self.variance()) |
| 155 | |
| 156 | def size(self): |
| 157 | return len(self.values) |
| 158 | |
| 159 | def widths(self): |
| 160 | return FieldWidth( |
| 161 | points=len("{}".format(self.size())) + 2, |
no outgoing calls
no test coverage detected
searching dependent graphs…