System informations
Project description
bmtools provides some tools dedicated to benchmarking.
Requirements
- python:
>= 3.7
- matplotlib:
>= 3.0
- numpy:
>= 1.1
Installation
Clone the github repo and
$ python setup.py install
or install via Pypi
$ pip install bmtools
Compare execution times
Benchmarking functions execution can be done with `Compare` class as follows:
import numpy as np
from bmtools import Compare
def star_op(x):
""" Double star operator. """
return x**0.5
def pow_op(x):
""" pow function. """
return pow(x, 0.5)
def sqrt_op(x):
""" numpy.sqrt function. """
return np.sqrt(x)
if __name__ == "__main__":
# Single comparison
bm1 = Compare(pow_op, star_op, sqrt_op)
bm1.run_single(fargs=(np.random.rand(1000000), ))
bm1.display()
# Parametric comparison
bm2 = Compare(pow_op, star_op, sqrt_op, unit='ms')
for n in [2**n for n in range(16, 23)]:
bm2.run_single(fargs=(np.random.rand(n), ), desc=n)
bm2.display()
bm2.bars()
+------------+---------------+----------------+----------------+-------+
| Function | Description | Runtime [msec] | Std [msec] | Equal |
+------------+---------------+----------------+----------------+-------+
| pow_op | -- | 1.56256 | 0.00798 | R1 |
| star_op | -- | 1.55787 | 0.00752 | ==R1 |
| sqrt_op | -- | 1.58628 | 0.04214 | ==R1 |
+------------+---------------+----------------+----------------+-------+
(...)
`Compare` provides three ways to display results:
As a simple plot with the `Compare.plot()` method
As a bar chart with the `Compare.bar()` method
As a text table with the `Compare.display()` method
`Compare` also provides the `parameters` decorator to specify a list of args/kwarg that have to be passed to a function for parametric study. The `Compare.run_parametric` method performs the comparison:
from bmtools import Compare
@Compare.parameters((1, 2,), (2, 3, ), x=(1, 10))
def op1(a, b, x=1):
return a*x + b
@Compare.parameters((1, 2,), (2, 3,), x=(1, 10))
def op2(a, b, x=1):
return a*x + b
if __name__ == "__main__":
bm3 = Compare(op1, op2, unit='nsec')
bm3.run_parametric()
bm3.display()
+------------+---------------+----------------+----------------+-------+
| Function | Description | Runtime [nsec] | Std [nsec] | Equal |
+------------+---------------+----------------+----------------+-------+
| op1 | 1, 2, x=1 | 398.0 | 22.3 | R1 |
| op2 | 1, 2, x=1 | 410.1 | 10.4 | ==R1 |
+------------+---------------+----------------+----------------+-------+
| op1 | 1, 2, x=10 | 408.5 | 13.7 | R2 |
| op2 | 1, 2, x=10 | 408.2 | 10.7 | ==R2 |
+------------+---------------+----------------+----------------+-------+
| op1 | 2, 3, x=1 | 399.4 | 8.2 | R3 |
| op2 | 2, 3, x=1 | 401.5 | 3.8 | ==R3 |
+------------+---------------+----------------+----------------+-------+
| op1 | 2, 3, x=10 | 392.0 | 17.6 | R4 |
| op2 | 2, 3, x=10 | 399.1 | 11.5 | ==R4 |
+------------+---------------+----------------+----------------+-------+
Time instance methods
The `mtimer` decorator can be used to time instance methods as follows:
import time
from bmtools import mtimer
class MtimeExample:
""" mtimer examples. """
def __init__(self):
self.string = 'mtimer example'
@mtimer(name='with arg')
def method1(self, string):
""" Example with argument. """
time.sleep(0.2)
print(self.string, string)
time.sleep(0.2)
@mtimer
def method2(self, string):
""" Example without argument. """
time.sleep(0.1)
print(self.string, string)
time.sleep(0.1)
if __name__ == "__main__":
mt = MtimeExample()
for _ in range(2):
mt.method1('with argument')
mt.method2('without argument')
format_mtimer(mt)
Add time probes to your code
The `TimeProbes` class provides a way to time blocks of code. Note that this class is largely inspired by Bench-it.
bm = TimeProbes() # Create our probes
time.sleep(0.1)
bm('example') # Create a probe named 'example'
time.sleep(0.2)
bm() # Create a probe without name
with bm as my_context: # Use probe as context manager.
time.sleep(0.8) # my_context will be the name of the probe
bm.display() # Display times measured at probe locations
+-------------------------------------------------------------------------------------------------------+
| TimeProbes |
+ ---------- + ------------------------ + ---------- + ---------------- + ---------------- + ---------- +
| Makers | File:line | Function | Avg time [msec] | Runtime [msec] | Percent |
+ ---------- + ------------------------ + ---------- + ---------------- + ---------------- + ---------- +
| example | test_probes_simple.py:33 | -- | 167.75452 | 167.75452 | 14334.3 |
| Probe 1 | test_probes_simple.py:35 | -- | 201.12324 | 201.12324 | 17185.6 |
| my_context | test_probes_simple.py:37 | -- | 800.91822 | 800.91822 | 68436.9 |
+ ---------- + ------------------------ + ---------- + ---------------- + ---------------- + ---------- +
References
The `TimeProbes` class is largely inpired by Bench-it:
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
File details
Details for the file bmtools-0.3.1.tar.gz
.
File metadata
- Download URL: bmtools-0.3.1.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6daaf7dd2aac1049c128c52d39fa9344ba37a0e408c4e3b889ef1e946d4f13b0 |
|
MD5 | 69b0539f468cc13b34bce96aff43b046 |
|
BLAKE2b-256 | 84d3e2db9bc6862eaa6673d4f1ea03d099afa44d724c3216866f54275f5bd2e3 |