https://github.com/blooop/bencher
A package for benchmarking the characteristics of arbitrary functions
https://github.com/blooop/bencher
benchmark benchmark-framework benchmarking dimensions exploration visualization
Last synced: 8 days ago
JSON representation
A package for benchmarking the characteristics of arbitrary functions
- Host: GitHub
- URL: https://github.com/blooop/bencher
- Owner: blooop
- License: mit
- Created: 2023-06-06T14:31:32.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2026-02-19T15:41:41.000Z (about 2 months ago)
- Last Synced: 2026-02-19T19:21:19.962Z (about 2 months ago)
- Topics: benchmark, benchmark-framework, benchmarking, dimensions, exploration, visualization
- Language: Python
- Homepage: https://bencher.readthedocs.io/
- Size: 35.8 MB
- Stars: 3
- Watchers: 1
- Forks: 3
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Bencher
## Continuous Integration Status
[](https://github.com/blooop/bencher/actions/workflows/ci.yml?query=branch%3Amain)

[](https://codecov.io/gh/blooop/bencher)
[](https://GitHub.com/blooop/bencher/issues/)
[](https://github.com/blooop/bencher/pulls?q=is%3Amerged)
[](https://pypi.org/project/holobench/)
[](https://pypistats.org/packages/holobench)
[](https://opensource.org/license/mit/)
[](https://www.python.org/downloads/)
[](https://pixi.sh)
## Install
```bash
pip install holobench
```
## Intro
Bencher is a tool to make it easy to benchmark the interactions between the input parameters to your algorithm and its resulting performance on a set of metrics. It calculates the [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) of a set of variables
Parameters for bencher are defined using the [param](https://param.holoviz.org/) library as a config class with extra metadata that describes the bounds of the search space you want to measure. You must define a benchmarking function that accepts an instance of the config class and return a dictionary with string metric names and float values.
Parameters are benchmarked by passing in a list N parameters, and an N-Dimensional tensor is returned. You can optionally sample each point multiple times to get back a distribution and also track its value over time. By default the data will be plotted automatically based on the types of parameters you are sampling (e.g, continuous, discrete), but you can also pass in a callback to customize plotting.
The data is stored in a persistent database so that past performance is tracked.
## Assumptions
The input types should also be of one of the basic datatypes (bool, int, float, str, enum, datetime) so that the data can be easily hashed, cached and stored in the database and processed with seaborn and xarray plotting functions. You can use class inheritance to define hierarchical parameter configuration class types that can be reused in a bigger configuration classes.
Bencher is designed to work with stochastic pure functions with no side effects. It assumes that when the objective function is given the same inputs, it will return the same output +- random noise. This is because the function must be called multiple times to get a good statistical distribution of it and so each call must not be influenced by anything or the results will be corrupted.
### Pseudocode of bencher
Enumerate a list of all input parameter combinations
for each set of input parameters:
pass the inputs to the objective function and store results in the N-D array
get unique hash for the set of inputs parameters
look up previous results for that hash
if it exists:
load historical data
combine latest data with historical data
store the results using the input hash as a key
deduce the type of plot based on the input and output types
return data and plot
## Demo
if you have [pixi](https://github.com/prefix-dev/pixi/) installed you can run a demo example with:
```bash
pixi run demo
```
An example of the type of output bencher produces can be seen here:
https://blooop.github.io/bencher/
## Examples
Most features are demonstrated in the auto-generated examples under `bencher/example/generated/`.
Run `pixi run generate-docs` to regenerate the full example gallery. Key sections include:
- `generated/N_float/` — Parameter sweeps with 0–3 float inputs, with/without repeats and over-time tracking
- `generated/plot_types/` — All supported plot types (scatter, line, heatmap, surface, etc.)
- `generated/result_types/` — Result types: images, videos, strings, booleans, paths, datasets
- `generated/composable_containers/` — Combining results with different composition strategies
- `generated/sampling/` — Custom values, levels, uniform, int vs float
- `generated/optimization/` — Single and multi-objective optimization with Optuna
- `generated/advanced/` — Time events, caching, aggregation over time
- `generated/regression/` — Performance regression detection
- `generated/statistics/` — Error bands, distributions, repeats comparison
A few hand-written examples remain for unique functionality:
- `example_simple_float.py` — Minimal getting-started example
- `example_image.py` / `example_video.py` — Image and video result types
- `example_self_benchmark.py` — Bencher self-introspection
- `example_workflow.py` — Multi-stage optimization workflow
## Documentation
- [Examples Documentation](https://bencher.readthedocs.io/reference/index.html)
- [API documentation](https://bencher.readthedocs.io/autoapi/bencher/index.html)
More documentation is needed for the examples and general workflow.