Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

Simplify logging of timings of selected parts of an application.

Project description

package version from PyPI build status from Travis CI test coverage from Codecov license

Timing module was created to simplify logging of timings of selected parts of an application.

How to use

Recommended initialization is as follows.

import timing

_TIME = timing.get_timing_group(__name__)  # type: timing.TimingGroup

This follows the conventions of logging module.

import logging

_LOG = logging.getLogger(__name__)

Any name can be used instead of __name__. However, if a names of format module.sub.subsub are used, this will create a timing hierarchy where each timing data is stored in its proper location and can be queried easier.

The resulting _TIME object is used to create individual timers, and will handle storing results in cache, which later can be used to obtain timing statistics.

You can obtain the timer object directly via start(name) method. You’ll need to manually call stop() in this case.

timer = _TIME.start('spam')  # type: timing.Timing

You can also obtain the timer object indirectly via measure(name) context manager. The context manager will take care of calling stop() at the end.

with _TIME.measure('ham') as timer:  # type: timing.Timing

And if you want to time many repetitions of the same action (e.g. for statistical significance) you can use measure_many(name[, samples][, threshold]) generator.

You can decide how many times you want to measure via samples parameter and how many seconds at most you want to spend on measurements via threshold parameter

for timer in _TIME.measure_many('eggs', samples=1000):  # type: timing.Timing

for timer in _TIME.measure_many('bacon', threshold=0.5):  # type: timing.Timing

for timer in _TIME.measure_many('tomatoes', samples=500, threshold=0.5):  # type: timing.Timing

Also, you can use measure and measure(name) as decorator. In this scenario you cannot access the timings directly, but the results will be stored in the timing group object, as well as in the global cache unless you configure the timing to not use the cache.

import timing

_TIME = timing.get_timing_group(__name__)

def recipe():

def bad_recipe():

Then, after calling each function the results can be accessed through summary property.


assert _TIME.summary['recipe']['samples'] == 1
assert _TIME.summary['the_best_recipe']['samples'] == 2

The summary property is dynamically computed on first access. Subsequent accesses will not recompute the values, so if you need to access the updated results, call the summarize() method.

assert _TIME.summary['recipe']['samples'] == 1

assert _TIME.summary['the_best_recipe']['samples'] == 2  # will fail
assert _TIME.summary['the_best_recipe']['samples'] == 2  # ok

Further API and documentation are in development.

See these examples in action in examples.ipynb notebook.


Python version 3.5 or later.

Python libraries as specified in requirements.txt.

Building and running tests additionally requires packages listed in test_requirements.txt.

Tested on Linux and OS X.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for timing, version 0.4.0
Filename, size File type Python version Upload date Hashes
Filename, size timing-0.4.0-py3-none-any.whl (12.8 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size timing-0.4.0.tar.gz (18.4 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page