Repository navigation
Commit 63c0697
authored
Stop sorting a whole column to size error-bar caps (#264)
`test_first_payload_errorbar_large` is the most expensive benchmark in the
suite (~557 ms on CodSpeed). Two thirds of it is work neither answer needs.
`_auto_cap_size` wants the median adjacent gap between distinct positions,
and reached for `np.unique` — which sorts unconditionally, an O(N log N)
pass over the full column. Error-bar positions are usually an ordered
independent variable, so one O(N) diff both proves the column is already
non-decreasing and yields those gaps directly; only an out-of-order column
still pays for the sort. Same distinct values in the same order, so the
median is identical.
`_zero_baseline_anchor` compacted `base`/`value` down to their finite rows
before asking three all-or-nothing questions about them, allocating and
copying two full columns per axis per build. Each question is really "does
any row violate this?", which the finite mask answers in place. NaN rows
are excluded by the mask exactly as the compaction excluded them.
Measured on the benchmark's shape (1M points, yerr=1.0, decimated tier),
min-of-3:
first payload 48.07 ms -> 14.09 ms -70.7%
_auto_cap_size 27.48 ms -> 2.92 ms -89.4% (1M sorted positions)
_zero_baseline 4.44 ms -> 1.99 ms -55.2% (3M rows)
Both sit on real build paths, not just the benchmark: cap sizing runs for
every auto-cap error bar, and the zero-baseline probe runs for every bar
and histogram build.
`_auto_cap_size` returns identically over sorted, unsorted, descending,
duplicate-heavy, all-equal, single, empty, NaN-bearing and -0.0-bearing
columns; `_zero_baseline_anchor` over all-positive, all-negative, mixed,
nonzero-base, NaN-bearing, all-NaN and all-zero columns.1 parent 119a1ce commit 63c0697
2 files changed
Lines changed: 22 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1075 | 1075 | | |
1076 | 1076 | | |
1077 | 1077 | | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
1078 | 1082 | | |
1079 | | - | |
| 1083 | + | |
1080 | 1084 | | |
1081 | | - | |
1082 | | - | |
1083 | | - | |
| 1085 | + | |
1084 | 1086 | | |
1085 | | - | |
| 1087 | + | |
1086 | 1088 | | |
1087 | | - | |
| 1089 | + | |
1088 | 1090 | | |
1089 | 1091 | | |
1090 | 1092 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1001 | 1001 | | |
1002 | 1002 | | |
1003 | 1003 | | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
1004 | 1011 | | |
1005 | | - | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
1006 | 1019 | | |
1007 | 1020 | | |
1008 | 1021 | | |
| |||
0 commit comments