Skip to main content

PyBencher is a Python benchmarking module for benchmarking several python functions at once.

Project description

PyBencher

GitHub Release PyPI Downloads GitHub Actions Workflow Status

PyBencher is a simple, decorator-based benchmarking suite for Python. It provides detailed timing statistics (average, median, standard deviation) and supports per-test configuration overrides.

Installation

pip install pybencher

Basic Usage

from pybencher import Suite

suite = Suite()

# Quick registration
@suite.bench()
def my_function():
    return sum(range(10000))

# Per-benchmark configuration
@suite.bench(name="Fast Math", max_samples=5000)
def fast():
    return 1 + 1

# Function arguments via args / kwargs
@suite.bench(args=(10, 20), name="Add")
def add(a, b):
    return a + b

# Manual registration (equivalent to @suite.bench)
def manual_func(n):
    return sum(range(n))

suite.add(manual_func, args=(1000,), name="Manual Register")

# Run and print results
results = suite.run()
results.print()

Configuration Overrides

Any setting in the Suite can be overridden per-benchmark via keyword arguments to bench() or add(). Function inputs are separated cleanly into the args and kwargs parameters.

Override Type Description
name str Display name in reports
timeout float Per-test time limit in seconds
max_samples int Maximum statistical samples to collect
min_samples int Minimum statistical samples to collect
cut float Percentage of outliers to trim (0.0 to 0.5)
disable_stdout bool Mute print() output inside the target
disable_gc bool Disable garbage collection during benchmark
batch_size int Force a specific batch size (0 for auto-calibration)
live_output bool Show real-time progress in the console
verbose bool Include extra stats in results.print()
before callable Local setup hook
after callable Local teardown hook
args tuple Positional arguments for the target function
kwargs dict Keyword arguments for the target function

Reference

Suite

  • timeout (float): Default time limit (10s).
  • max_samples (int): Default max samples (1000).
  • min_samples (int): Default min samples (3).
  • cut (float): Default outlier threshold (0.05).
  • warmup_samples (int): Number of unmeasured runs to perform before benchmarking (0).
  • validate_responses (bool): Enable cross-test output consistency checks (False).
  • validate_limit (int): Max number of iterations to store for full sequence validation (5).
  • disable_stdout (bool): Global stdout suppressor.
  • disable_gc (bool): Global GC control.
  • batch_size (int): Global batch size override.
  • live_output (bool): Global progress toggle.
  • verbose (bool): Global verbosity flag.

BenchmarkResults

  • print(verbose=None): Print results to console.
  • to_json(indent=4): Export results to JSON.
  • to_markdown(): Export results as a GitHub-flavored markdown table.
  • to_list(): Export results to list of dicts.

BenchmarkResult

Dataclass containing:

  • name: Target name or custom override.
  • avg, std, median, minimum, maximum: Timing stats in seconds.
  • itr_ps: Iterations per second.
  • iterations: Total runs.
  • counted_iterations: Runs used for stats after trimming outliers.

Example

from pybencher import Suite

suite = Suite()

# 'timeout' here is a benchmark config override, not a function param
@suite.bench(args=(0.1,), name="Sleepy", verbose=True)
def test_sleep(duration):
    import time
    time.sleep(duration)

# Function kwargs stay separate from benchmark config
@suite.bench(kwargs={"timeout": 0.1}, name="Sleepy Alt", verbose=True)
def test_args(timeout):
    import time
    time.sleep(timeout)

results = suite.run()
results.print()

Output:

Sleepy: 100ms/itr | 10.0 itr/s
  std:     120us
  median:  100ms
  min/max: 99ms / 101ms
  runs:    10 (10 counted)
  total:   1.01s

CI/CD Pipeline

PyBencher uses an automated GitHub Actions pipeline:

  • Testing: Every push to any branch triggers a full test suite across Linux, Windows, and macOS for Python 3.10–3.14.
  • Publishing: Pushes to main automatically publish to PyPI if and only if all tests pass.

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

pybencher-2.4.1.tar.gz (45.1 kB view details)

Uploaded Source

Built Distribution

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

pybencher-2.4.1-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file pybencher-2.4.1.tar.gz.

File metadata

  • Download URL: pybencher-2.4.1.tar.gz
  • Upload date:
  • Size: 45.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pybencher-2.4.1.tar.gz
Algorithm Hash digest
SHA256 7c688f5a9675fe4da017fb4666f5f368697c7c4058831943403168c57e3d9349
MD5 339316e44bfdc814ecc44ac2b16c1537
BLAKE2b-256 296dc5774128f5b1d04ec7d28552c48af508f10376ebfd8b2a5391c4bcf583de

See more details on using hashes here.

File details

Details for the file pybencher-2.4.1-py3-none-any.whl.

File metadata

  • Download URL: pybencher-2.4.1-py3-none-any.whl
  • Upload date:
  • Size: 9.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pybencher-2.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1ab6e8a2390f28ea82b1ef762167ba7b673ca3efbc47ce3d8c6a1ec17f238e76
MD5 d586190e40a2a9666cdeea2a18eb8697
BLAKE2b-256 adc5d9791bb15ade91b23e76c26cb1d0acec90da72625ff3f761a798aab94dbb

See more details on using hashes here.

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