A simple and easy-to-use Python benchmarking library
Project description
EasyBench
A simple and easy-to-use Python benchmarking library.
Features
- Four benchmarking styles: decorator, class-based, command-line, and Jupyter Notebook
- Measure both execution time and memory usage (see limitations)
- Rich visualizations (Boxplot, Violinplot, Lineplot, Histogram, Barplot)
- Advanced options: warmup runs, multiple loops per trial, outlier trimming
- Parametrized benchmarks for comparing function performance with different inputs
- pytest-like fixtures and lifecycle hooks (setup/teardown)
- Flexible configuration: time/memory units, progress tracking, filtering
- Multiple output formats (text tables, CSV, JSON, pandas.DataFrame)
- Extensible reporting system for custom outputs
Installation
pip install easybench
Optional Dependencies
EasyBench supports optional dependencies for additional features:
# Install with visualization support
pip install easybench[all]
The all option includes:
matplotlib: For visualization and plotting benchmark resultsseaborn: For enhanced statistical visualizationspandas: For outputting benchmark results as DataFramestqdm: For progress tracking during benchmark execution
Quick Start
There are 4 ways to benchmark with easybench:
-
@benchdecoratorfrom easybench import bench # Add @bench with function parameters @bench(item=123, big_list=lambda: list(range(1_000_000))) def insert_first(item, big_list): big_list.insert(0, item)
- When you need fresh data for each trial, use a function or lambda to generate new data on demand.
(likelambda: list(range(1_000_000))in the above)
- When you need fresh data for each trial, use a function or lambda to generate new data on demand.
-
EasyBenchclassfrom easybench import EasyBench, BenchConfig class BenchListOperation(EasyBench): # Benchmark configuration bench_config = BenchConfig( trials=10, memory=True, sort_by="avg" ) # Setup for each trial def setup_trial(self): self.big_list = list(range(1_000_000)) # Benchmark methods (must start with bench_) def bench_insert_first(self): self.big_list.insert(0, 123) # You can define multiple benchmark methods def bench_pop_first(self): self.big_list.pop(0) if __name__ == "__main__": # Run benchmark BenchListOperation().bench()
-
easybenchcommand-
Create a
benchmarksdirectory -
Put
bench_*.pyscripts in the directory:from easybench import fixture # Fixture for each trial @fixture(scope="trial") def big_list(): return list(range(1_000_000)) # Benchmark functions (must start with bench_) def bench_insert_first(big_list): big_list.insert(0, 123) # You can define multiple benchmark functions def bench_pop_first(big_list): big_list.pop(0)
-
Run
easybenchcommandeasybench --trials 10 --memory --sort-by avg
-
-
%%easybenchmagic command (Jupyter Notebook)-
Load the extension
%load_ext easybench
-
Benchmark cell code
%%easybench --trials=3 --memory result = [] for i in range(1_000_000): result.append(i)
-
Example of benchmark results:
-
Single benchmark
Benchmark Results (5 trials): Function Avg Time (s) Min Time (s) Max Time (s) -------------------------------------------------------- insert_first 0.001568 0.001071 0.003265 -
Multiple benchmarks
-
Boxplot Visualization
-
Violinplot Visualization
-
Lineplot Visualization
-
Histogram Visualization
-
Barplot Visualization
Usage
For detailed usage instructions, please refer to the documentation.
Memory Measurement Limitations
EasyBench uses Python's built-in tracemalloc module to measure memory usage.
This has some important limitations:
tracemalloconly tracks memory allocations made through Python's memory manager- Memory allocated by C extensions (like NumPy, Pandas, or other native libraries) often bypasses Python's memory manager and won't be accurately measured
- The reported memory usage reflects Python objects only, not the total process memory consumption
For applications heavily using C extensions, consider using external profilers like
memory_profileror system monitoring tools for more accurate measurements.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easybench-0.1.36.tar.gz.
File metadata
- Download URL: easybench-0.1.36.tar.gz
- Upload date:
- Size: 467.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.10.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
334a5770c7ab303d339c1fb06e4edc9b93819a82713b995bb2fdb8a31be321d9
|
|
| MD5 |
4201e92a87e057d4b74b7153ada7153f
|
|
| BLAKE2b-256 |
11c0b0d338afb7e11792753e88d061cd2def8bea799197c696e5fd4096a526db
|
File details
Details for the file easybench-0.1.36-py3-none-any.whl.
File metadata
- Download URL: easybench-0.1.36-py3-none-any.whl
- Upload date:
- Size: 45.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.10.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d66d716be7f5bcb32e575cacedaad08d6bc19418bf22a6f7b2f913681dd873f
|
|
| MD5 |
c23906916f526df22b06a945ca95fb77
|
|
| BLAKE2b-256 |
b376efa5de99602844ffe7c5832bfd2537f0904b02089f729ce07c1086e7df29
|