clocked

python library for high level profiling


Keywords
benchmark, benchmarking, profiler, profiling
License
Other
Install
pip install clocked==0.4

Documentation

Clocked

A library to enable easier profiling, based loosely on MiniProfiler. For a more full-featured implementation for use in web development, check out the [GAE Mini Profiler] (https://github.com/Khan/gae_mini_profiler). This library is meant to be more lightweight than a full MiniProfiler implementation so that you can quickly load it into a project and start timing things.

Use Case

I was looking to profile some code and came across [this blog post] (http://www.huyng.com/posts/python-performance-analysis/) that covers things quite nicely. However, the coarse and fine grain timing sections leaves a lot up to reader and aren't very robust, so this library is meant to fill the gap.

This library is meant to be used to do higher-level profiling, where you litter your code with profiling statements and generate a report to quickly find where your code is spending all of it's time. From there, fall back to tools like [timeit](https://docs.python.org/2/library/timeit .html) or line_profiler.

To start, initialize the session by calling

Clocked.initialize('at the root scope!')

Then run your code with clocked decorators and/or with Clocked statements. At the end of the session, output a report with either Clocked.verbose_report() or Clocked.hotspot_report() to see some timing information.

Supported ways to decorate

class level

@clocked
class MyClass(object):

  def will_be_timed_one(self):
    ...

  def will_be_timed_two(self):
    ...

function level

class MyClass(object):

  @clocked
  def will_be_timed(self):
    ...

  def will_not_be_timed(self):
    ...

Decorators aren't specific to classes, so you can apply them to individual functions like so

@clocked
def some_function():
  ...

How to use inline

You can use the Clocked object to time something without using a decorator

with Clocked("i'm timing this!"):
  ...

Generate a report

To get at the timing information, the simplest thing to do is generate a report

>>> Clocked.verbose_report()
"""
All timing information:
-----------------------
test raw simple (326.5 ms)
 loop 1 (326.5 ms)
"""
>>> Clocked.hotspot_report()
"""
Hotspots:
---------
loop 4 (164.5 ms [19.9, 22.0], 8 hits)
loop 3 (160.8 ms [19.9, 20.9], 8 hits)
loop 2 (1.0 ms [0.2, 0.3], 4 hits)
loop 1 (0.2 ms [0.2, 0.2], 1 hits)
test raw simple (0.0 ms [0.0, 0.0], 1 hits)
"""

Performance

To improve performance when testing single-threaded applications, enable faster uuid generation by turning on thread unsafe uuid generation with clocked.cuuid.toggle_thread_unsafe_uuid(True)