#!/usr/bin/env python
"""
A profiler decorator.
Author: Giampaolo Rodola'
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)