[Python-Dev] profiler decorator - is it worth for inclusion? (original) (raw)

Giampaolo RodolĂ  g.rodola at gmail.com
Thu Jul 15 20:45:53 CEST 2010


Today I was looking for a quick and dirty way to profile a method of a class. I was thinking that cProfile module had a decorator for this but I was wrong so I decided to write one based on hotshot. Would it be worth for inclusion?

#!/usr/bin/env python

import hotshot import hotshot.stats import tempfile import pstats

def profile(sort='cumulative', lines=30, 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)
         1 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:60(factorial)
        0    0.000             0.000          profile:0(profiler)


120
>>>
"""
def outer(fun):
    def inner(*args, **kwargs):
        file = tempfile.NamedTemporaryFile()
        prof = hotshot.Profile(file.name)
        try:
            ret = prof.runcall(fun, *args, **kwargs)
        finally:
            prof.close()

        stats = hotshot.stats.load(file.name)
        if strip_dirs:
            stats.strip_dirs()
        if isinstance(sort, tuple):
            stats.sort_stats(*sort)
        else:
            stats.sort_stats(sort)
        stats.print_stats(lines)

        return ret
    return inner

return outer


More information about the Python-Dev mailing list