Monday, September 6, 2010

Python Decorator para imprimir o desempenho de um método

Decorators do Python são bem legais, né? É uma solução elegante, simples e 100% OO. Olha um decorator que fiz para imprimir o desempenho de um método (sugestões são sempre bemvindas):


Exemplo de uso:
@print_performancedef minha_funcao(): pass
Implementação:
try: from functools import wrapsexcept ImportError: # Python 2.3, 2.4 fallback. from django.utils.functional import wrapsimport timedef print_performance(function): def wrapped_function(*args, **kwargs): print('START %s(%s)' % (function.__name__, args,)) start_time = time.clock() exception = None try: result = function(*args, **kwargs) except Exception, e: exception = e end_time = time.clock() if exception: print('END-ERROR %s(%s): %ss' % (function.__name__, args, str(end_time - start_time))) raise exception print('END %s(%s): %ss' % (function.__name__, args, str(end_time - start_time))) return result return wraps(function)(wrapped_function)

2 comments:

  1. Sim, decorators são bem legais mesmo! No passado escrevi isto a respeito: http://blog.paulojeronimo.com/2009/04/o-do-phyton-parece-com-o-do-java-mas.html

    []s,
    PJ

    ReplyDelete
  2. Bacana, vou ver lá! Alias, fiz umas atualizações no código, só melhorando um pouco as strings do print para ajudar no debug. abs!

    ReplyDelete