Skip to main content

Stopwatch as a context manager.

Project description

# pip install withstopwatch
# >>> from withstopwatch import Stopwatch

Basic usage:
>>> with Stopwatch():
...     print('<some activity to be measured>')
<some activity to be measured>
0 ms

Using fields:
>>> with Stopwatch() as s:
...     pass
0 ms
>>> assert isinstance(s.label, str) and s.label == '0 ms'
>>> assert isinstance(s.ms, int) and s.ms == 0
>>> assert isinstance(s.s, int) and s.s == 0
>>> assert isinstance(s.seconds, float) and s.seconds > 0
>>> assert isinstance(s.timedelta, datetime.timedelta)
>>> assert isinstance(s.start, datetime.datetime)
>>> assert isinstance(s.stop, datetime.datetime)

`str` and `repr`:
>>> assert str(s) == s.label
>>> repr(s)  # doctest: +ELLIPSIS
'<Stopwatch: datetime.timedelta(0, 0, ...)>'

Silence options:
>>> with Stopwatch(template=None) as s:
...     pass
>>> assert s.label is None
>>> with Stopwatch(file=None) as s:
...     pass
>>> assert s.label == '0 ms'

With different templates:
>>> with Stopwatch(template='passing'):
...     pass
0 ms: passing
>>> with Stopwatch('passing'):
...     pass
0 ms: passing
>>> with Stopwatch('{ms} ms'):
...     pass
0 ms
>>> with Stopwatch('{s} s'):
...     pass
0 s
>>> with Stopwatch('{:.03f} (i.e. {seconds:.03f})'):
...     pass
0.000 (i.e. 0.000)
>>> with Stopwatch('{timedelta}'):
...     pass   # doctest: +ELLIPSIS
0:00:00.000...
>>> with Stopwatch('from {start!r} to {stop!r}') as s:
...     pass   # doctest: +ELLIPSIS
from datetime.datetime(...) to datetime.datetime(...)
>>> assert s.stop - s.start == s.timedelta

With an exception (note: due to limitations of `doctest`, we can't check
easily both that something is printed and that an exception is raised):
>>> with Stopwatch(file=None):
...     raise Exception()
Traceback (most recent call last):
Exception
>>> try:
...     with Stopwatch() as s:
...        raise Exception()
... except Exception as exc:
...     print(repr(s))  # doctest: +ELLIPSIS
0 ms (failed)
<Stopwatch: datetime.timedelta(0, 0, ...)>
>>> try:
...     with Stopwatch('abc') as s:
...        raise Exception()
... except Exception as exc:
...     print(repr(s))  # doctest: +ELLIPSIS
0 ms: abc (failed)
<Stopwatch: datetime.timedelta(0, 0, ...)>

Testing with `time.sleep` (note: the tests may fail during a slower run):
>>> import time
>>> with Stopwatch() as s:
...     time.sleep(0.1)
100 ms
>>> assert 0.1 < s.seconds < 0.2

Embedded stopwatchs:
>>> with Stopwatch('outer'):
...     with Stopwatch('inner'):
...         pass
0 ms: inner
0 ms: outer

Measuring the overhead of Stopwatch using Stopwatch itself
(note: the tests may fail during a slower run):
>>> with Stopwatch(file=None) as s1:
...     with Stopwatch('inner') as s2:
...         pass
0 ms: inner
>>> with Stopwatch(file=None) as s3:
...     pass
>>> overhead = s1.seconds - s3.seconds
>>> assert 0 <= overhead < 0.0001
... # ~20 us on i5@2.60GHz, Python 3.6.0, Linux

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

withstopwatch-0.2.0.tar.gz (2.4 kB view hashes)

Uploaded source

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page