#!/usr/bin/env python """ A profiler decorator. Author: Giampaolo Rodola' <g.rodola [AT] gmail [DOT] com> License: MIT """ import cProfile import tempfile import pstats def profile(sort='cumulative', lines=50, strip_dirs=False): """A decorator which profiles a callable. Example usage: >>> @profile def factorial(n): n = abs(int(n)) if n < 1: n = 1 x = 1 for i in range(1, n + 1): x = i * x return x ... >>> factorial(5) Thu Jul 15 20:58:21 2010 /tmp/tmpIDejr5 4 function calls in 0.000 CPU seconds Ordered by: internal time, call count ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 profiler.py:120(factorial) 1 0.000 0.000 0.000 0.000 {range} 1 0.000 0.000 0.000 0.000 {abs} 120 >>> """ def outer(fun): def inner(*args, **kwargs): file = tempfile.NamedTemporaryFile() prof = cProfile.Profile() try: ret = prof.runcall(fun, *args, **kwargs) except: file.close() raise prof.dump_stats(file.name) stats = pstats.Stats(file.name) if strip_dirs: stats.strip_dirs() if isinstance(sort, (tuple, list)): stats.sort_stats(*sort) else: stats.sort_stats(sort) stats.print_stats(lines) file.close() return ret return inner # in case this is defined as "@profile" instead of "@profile()" if hasattr(sort, '__call__'): fun = sort sort = 'cumulative' outer = outer(fun) return outer if __name__ == '__main__': @profile def factorial(n): n = abs(int(n)) if n < 1: n = 1 x = 1 for i in range(1, n + 1): x = i * x return x factorial(10)