quarta-feira, 16 de maio de 2012

Usando decorators para timing

E ai pessoal, tudo bem?

O último post foi bem extenso porque eu precisava dar um overview sobre o assunto, mas este será mais objetivo. Depois de escrever sobre profiling tive oportunidade de aplicar o que venho estudando em um projeto e ver, na prática, o quanto este conhecimento é importante. Também recebi boas criticas sobre a publicação anterior, sinal que o assunto é do interesse de mais gente! Por tanto, vamos a uma dica que tem me ajudado bastante.

Das ferramentas citadas no post anterior tenho usado muito o Django Debug Toolbar e o modulo timeit do Python, mas nenhum dos dois supriu minha necessidade de saber, de forma simples e rápida, quanto tempo um determinado método ou uma view do Django demora para ser executada. No inicio eu fiz a subtração do tempo, como o módulo time, no próprio método mas logo percebi que precisava de um decorator. Depois de pesquisar um pouco, cheguei a minha versão do mesmo que compartilho com vocês:

import time

def timing_logger(timed):
    def wrap(*args, **kwargs):
        start = time.time()
        res = timed(*args, **kwargs)
        delta = time.time() - start
        print '%.3f secs on %s' % (delta, timed.func_name)
        return res

    wrap.__doc__ = timed.__doc__
    wrap.__name__= timed.__name__
    return wrap
Procurando na internet, ou mesmo em meu post anterior, é possível encontrar soluções mais elaboradas como os módulos Python profile, hotshot e os projetos django-extensions e KCachegrind mas estes não são muito práticos já que não permitem grande agilidade na analise do profiling. Desta forma, acabo deixando para usar analises mais elaboradas quanto a informação de tempo gasto não é suficiente, um exemplo disso são view ou métodos muito grandes e que tem várias chamadas para outros métodos.

Este decorator tem sido uma das principais ferramentas que estou usando na refatoração de um sistema para melhorar a performance e pretendo usa-lo nos próximos posts onde vou me aprofundar mais sobre profiling e dicas para melhorar a performance de apps Django.

Espero que ajude vocês tanto quanto tem me ajudado. Um abraço!