Zero-overhead Python and JAX Reliable Benchmarking
ZeroPyBench is a Python benchmarking library with zero overhead, designed for multidimensional performance analysis.
Features
- Context manager API: Benchmark any code block with
with bench(...): ... - Multidimensional: Tag benchmarks with arbitrary keyword arguments
- Zero overhead: Code is passed directly to
timeit.Timer, no wrapper function - Auto-scaling: Automatically determines the number of iterations for reliable measurements
- Multiple exports: CSV, Parquet, Markdown
- Plotting: Built-in visualization with matplotlib
Quick Example
from zeropybench import Benchmark
bench = Benchmark()
for n in [100, 1000, 10000]:
data = list(range(n))
with bench(method='sum', n=n):
sum(data)
with bench(method='len', n=n):
len(data)
Output:
method=sum, n=100: 575.124 ns ± 3.35% (median of 7 runs, 500000 loops each)
method=len, n=100: 19.037 ns ± 0.85% (median of 7 runs, 20000000 loops each)
method=sum, n=1000: 2.961 µs ± 36.70% (median of 7 runs, 50000 loops each)
method=len, n=1000: 19.844 ns ± 38.63% (median of 7 runs, 10000000 loops each)
method=sum, n=10000: 50.208 µs ± 9.89% (median of 7 runs, 5000 loops each)
method=len, n=10000: 28.686 ns ± 1.22% (median of 7 runs, 20000000 loops each)
print(bench)
┌───┬────────┬────────┬────────────────────────────┬───────────┐
│ ┆ method ┆ n ┆ median_execution_time (ns) ┆ ± (%) │
╞═══╪════════╪════════╪════════════════════════════╪═══════════╡
│ 0 ┆ sum ┆ 100 ┆ 575.124442 ┆ 3.353129 │
│ 1 ┆ len ┆ 100 ┆ 19.036998 ┆ 0.854601 │
│ 2 ┆ sum ┆ 1_000 ┆ 2_961.25732 ┆ 36.698258 │
│ 3 ┆ len ┆ 1_000 ┆ 19.844193 ┆ 38.63371 │
│ 4 ┆ sum ┆ 10_000 ┆ 50_207.584997 ┆ 9.894165 │
│ 5 ┆ len ┆ 10_000 ┆ 28.686439 ┆ 1.22376 │
└───┴────────┴────────┴────────────────────────────┴───────────┘
JAX Support
ZeroPyBench automatically detects JAX arrays and optimizes benchmarking accordingly:
import jax.numpy as jnp
from zeropybench import Benchmark
bench = Benchmark(repeat=20, verbose=True)
x = jnp.ones(1_000_000)
y = jnp.ones(1_000_000)
with bench():
x + y
Setup code:
@jax.jit
def __bench_func(x, y):
return x + y
Benchmarked code:
__bench_func(x, y).block_until_ready()
943.426 µs ± 3.98% (median of 20 runs, 500 loops each)
When JAX code is detected, ZeroPyBench:
- Wraps the code in a JIT-compiled function to measure optimized execution
- Separates compilation from execution by reporting
compilation_timeseparately - Captures the StableHLO representation of the compiled function in the
hlofield - Uses
block_until_readyto ensure accurate timing of asynchronous operations
The benchmark report includes additional fields for JAX:
first_execution_time: Time of the initial (possibly uncompiled) executioncompilation_time: Time to lower and compile the functiongenerated_code_size: Total size of the generated machine code in bytes, including embedded constantstemp_size: Size of the preallocated temporary buffer arena in bytes, excluding input arguments, outputs, and constantshlo: The StableHLO text representation of the compiled computation
report = bench[0]
print(report['compilation_time']) # e.g., 12345.67 ns
print(report['hlo'][:100]) # HLO module "jit___bench_func" ...
Installation
pip install zeropybench
Export and Visualization
# Export results
bench.write_csv('results.csv')
bench.write_parquet('results.parquet')
bench.write_markdown('results.md')
# Plot results
bench.plot()
bench.write_plot('results.pdf')
Configuration
Benchmark(
repeat=7, # Number of measurement repetitions
min_duration_per_repeat=0.2, # Minimum duration per repeat (seconds)
verbose=True, # Print the setup and benchmarked code
)
License
MIT
Metadata
Release files for zeropybench 1.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zeropybench-1.2.3.tar.gz | 247.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zeropybench-1.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 267.9 kB
Release files / zeropybench-1.2.3.tar.gz
| Download URL | zeropybench-1.2.3.tar.gz |
|---|---|
| Size | 247.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbc72744268ccfc8e03a27d3937adb9461ca0100610a6b70797c4a9f83250f37
|
|
BLAKE2b-256 checksum How to use checksums |
ced23734d782762048ec5e6ffc079701193f7b648058c39b1cd7494881482cee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 10, 2026.
Transparency logRelease files / zeropybench-1.2.3-py3-none-any.whl
| Download URL | zeropybench-1.2.3-py3-none-any.whl |
|---|---|
| Size | 20.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6e6dd5ae58196c8050ceb08fcc7408cae3e806105d1814b5bfc69e747451ab99
|
|
BLAKE2b-256 checksum How to use checksums |
6c59ba69ad39b49992a0d412411431ffe8a514cec85b9d7fdff7c9aff3c15734
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 10, 2026.
Transparency log