get_summary() makes five independent passes over self.results:
sum(1 for r in self.results if r.passed) — passed count
[r.metrics.latency_ms for r in self.results if r.metrics] — latencies list
sum(r.metrics.cost_usd or 0 for r in self.results if r.metrics) — total cost
sum(r.metrics.total_tokens or 0 for r in self.results if r.metrics) — total tokens
5–6. _count_execution_errors() and _count_validation_failures() — two more full iterations
All six values can be computed in a single pass. As the result set grows, the current implementation performs O(6n) work where O(n) is sufficient.
get_summary()makes five independent passes overself.results:sum(1 for r in self.results if r.passed)— passed count[r.metrics.latency_ms for r in self.results if r.metrics]— latencies listsum(r.metrics.cost_usd or 0 for r in self.results if r.metrics)— total costsum(r.metrics.total_tokens or 0 for r in self.results if r.metrics)— total tokens5–6.
_count_execution_errors()and_count_validation_failures()— two more full iterationsAll six values can be computed in a single pass. As the result set grows, the current implementation performs O(6n) work where O(n) is sufficient.