Skip to main content

A multidimensional benchmarking library with minimal overhead

Project description

zeropybench

Zero-overhead Python and JAX Reliable Benchmarking

PyPI version Python versions Continuous integration Coverage

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:

  1. Wraps the code in a JIT-compiled function to measure optimized execution
  2. Separates compilation from execution by reporting compilation_time separately
  3. Captures the StableHLO representation of the compiled function in the hlo field
  4. Uses block_until_ready to ensure accurate timing of asynchronous operations

The benchmark report includes additional fields for JAX:

  • first_execution_time: Time of the initial (possibly uncompiled) execution
  • compilation_time: Time to lower and compile the function
  • generated_code_size: Total size of the generated machine code in bytes, including embedded constants
  • temp_size: Size of the preallocated temporary buffer arena in bytes, excluding input arguments, outputs, and constants
  • hlo: 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zeropybench-1.2.0.tar.gz (243.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zeropybench-1.2.0-py3-none-any.whl (20.9 kB view details)

Uploaded Python 3

File details

Details for the file zeropybench-1.2.0.tar.gz.

File metadata

  • Download URL: zeropybench-1.2.0.tar.gz
  • Upload date:
  • Size: 243.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zeropybench-1.2.0.tar.gz
Algorithm Hash digest
SHA256 63cb9f04361cf7057a46d5ebce12d2fc8e6465e222cbe42405e6ff3a9c80f7b2
MD5 370e986c58a06a3c7ca5f84d9ff6b50c
BLAKE2b-256 3ef5eb2d3e84e57527a5f0b6d52c4bdca8a8cae8879248aad48da98054283c64

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeropybench-1.2.0.tar.gz:

Publisher: release.yml on CMBSciPol/zeropybench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file zeropybench-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: zeropybench-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 20.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zeropybench-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4731d1a94096491535c482c3926689025fede04415d76c04dd6e2064721b7f73
MD5 dc227fcd27e90fe92d56fbfcbfd87995
BLAKE2b-256 21c6372d4c71416f69bd314c17098ddeb85b44687c56e0ea9d459e2fd9a49c54

See more details on using hashes here.

Provenance

The following attestation bundles were made for zeropybench-1.2.0-py3-none-any.whl:

Publisher: release.yml on CMBSciPol/zeropybench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page