Skip to content

pytest_park.models.benchmark

[docs] module pytest_park.models.benchmark

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from __future__ import annotations

from dataclasses import dataclass, field
from datetime import datetime
from typing import Any


@dataclass(slots=True)
class BenchmarkStats:
    """Core benchmark statistics from pytest-benchmark."""

    mean: float
    median: float
    min: float
    max: float
    stddev: float
    rounds: int
    iterations: int
    ops: float


@dataclass(slots=True)
class BenchmarkCase:
    """A single benchmark case in a run."""

    name: str
    fullname: str
    normalized_name: str
    normalized_fullname: str
    base_name: str
    method_parameters: str | None
    method_postfix: str | None
    benchmark_group: str | None
    marks: tuple[str, ...]
    params: dict[str, str]
    custom_groups: dict[str, str]
    stats: BenchmarkStats

    @property
    def case_key(self) -> str:
        """Build a deterministic key for cross-run comparisons."""
        param_bits = ",".join(f"{key}={value}" for key, value in sorted(self.params.items()))
        return f"{self.fullname}|{param_bits}"


@dataclass(slots=True)
class BenchmarkRun:
    """A full benchmark run loaded from one JSON artifact."""

    run_id: str
    source_file: str
    created_at: datetime | None
    tag: str | None
    commit_id: str | None
    machine: str | None
    python_version: str | None
    metadata: dict[str, Any] = field(default_factory=dict)
    cases: list[BenchmarkCase] = field(default_factory=list)
    profiler: dict[str, dict[str, Any]] = field(default_factory=dict)


@dataclass(slots=True)
class BenchmarkDelta:
    """A comparison result for one benchmark case."""

    group_label: str
    case_key: str
    benchmark_name: str
    params: dict[str, str]
    reference_run_id: str
    candidate_run_id: str
    reference_mean: float
    candidate_mean: float
    delta_pct: float
    speedup: float


@dataclass(slots=True)
class GroupSummary:
    """Aggregated comparison metrics for a logical group."""

    label: str
    count: int
    average_delta_pct: float
    median_delta_pct: float
    improvements: int
    regressions: int
    unchanged: int


@dataclass(slots=True)
class TrendPoint:
    """Time-series data for one case and run."""

    run_id: str
    timestamp: datetime | None
    mean: float