Observed since 20 Oct, 18:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Track Python function performance across commits. Catch regressions before they ship.
Track Python function performance across commits. Catch regressions before they ship.
ACENLY Bench · main@a3f9c1b2 · Python 3.12.3
Function Median P95 vs last commit
──────────────────────────────────────────────────────────────
deduplicate_users 1.24 ms 1.51 ms ▼ 38.1% faster
build_index 84.21 ms 97.13 ms ▲ 12.4% slower ⚠
filter_records 0.88 ms 0.92 ms ~ +0.2%
No external services. No accounts. Runs entirely on your machine.
pip install pyyaml
Then copy bench.py and bench_db.py into your project root.
# Benchmark a specific function right now
python3 bench.py myfile.py::my_function
# Show history for tracked functions
python3 bench.py --history
# High-precision mode (batch timing, 3s measurement window)
python3 bench.py --precise
Create acenly.yml in your project root (see acenly.example.yml):
benchmark:
track:
- file: mymodule/utils.py
function: process_batch
- file: mymodule/search.py
function: find_duplicates
regression_warn: 0.10 # warn if 10% slower
regression_block: 0.25 # block push if 25% slower
noise_floor: 0.05 # ignore changes smaller than 5%
trials: 5
warmup: 2
Then install the git hook:
python3 bench.py --install-hooks
From now on, every git push runs the benchmark automatically. If a function regresses past the block threshold, the push is stopped.
python3 bench.py --skip-hooks # bypass when needed
python3 bench.py --uninstall-hooks
| Flag | Description |
|---|---|
file.py::func | Benchmark a specific function |
--compare | Show diff vs last stored result |
--history | Print run history for tracked functions |
--precise | High-precision mode: adaptive warmup, batch timing |
--repeat N | Run N times, keep the best result |
--install-hooks | Install git pre-push hook |
--uninstall-hooks | Remove git pre-push hook |
--skip-hooks | Run benchmark without enforcing regression block |
--hook-mode | Used internally by the git hook |
Each benchmark runs in a separate subprocess to avoid interference from the parent process. In normal mode, each function is called trials times with warmup discarded runs first. In --precise mode:
Results are stored in bench.db alongside your project.
MIT
pypistats · 41 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-18 – 2026-10-18 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-17 – 2026-10-17 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-15 – 2026-10-15 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-13 – 2026-10-13 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-09 – 2026-10-09 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-08 – 2026-10-08 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-07 – 2026-10-07 | 4 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-06 – 2026-10-06 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-10-01 – 2026-10-01 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-30 – 2026-09-30 | 5 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-29 – 2026-09-29 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-28 – 2026-09-28 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-26 – 2026-09-26 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-18 – 2026-09-18 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-14 – 2026-09-14 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-12 – 2026-09-12 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-09 – 2026-09-09 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-07 – 2026-09-07 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-06 – 2026-09-06 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-03 – 2026-09-03 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-09-01 – 2026-09-01 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-31 – 2026-08-31 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-24 – 2026-08-24 | 8 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-23 – 2026-08-23 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-20 – 2026-08-20 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-18 – 2026-08-18 | 18 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-17 – 2026-08-17 | 4 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-14 – 2026-08-14 | 4 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-13 – 2026-08-13 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-09 – 2026-08-09 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-07 – 2026-08-07 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-04 – 2026-08-04 | 4 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-03 – 2026-08-03 | 4 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-02 – 2026-08-02 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-08-01 – 2026-08-01 | 1 | 2026-10-20T19:11:01.6498676Z |
| 2026-07-27 – 2026-07-27 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-07-23 – 2026-07-23 | 3 | 2026-10-20T19:11:01.6498676Z |
| 2026-07-22 – 2026-07-22 | 2 | 2026-10-20T19:11:01.6498676Z |
| 2026-07-21 – 2026-07-21 | 2 | 2026-10-20T19:11:01.6498676Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 30 Jun 2026 | 1 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:20cfd83413fa9a054aa83f143aba1514a2d89e51e55077f1159ea131c330a69d