Respostas:
Experimente o Django Debug Toolbar . Ele mostrará quais consultas são executadas em cada página e quanto tempo levam. É uma ferramenta realmente útil, poderosa e fácil de usar.
Além disso, leia as recomendações sobre o desempenho do Django em Otimização de acesso ao banco de dados na documentação.
E dicas de desempenho do Django por Jacob Kaplan-Moss.
Basta digitar "django-profiling" no google, você obterá estes links (e mais):
http://code.djangoproject.com/wiki/ProfilingDjango
http://code.google.com/p/django-profiling/
http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/
Pessoalmente, eu estou usando a abordagem de middleware - ou seja, cada usuário pode alternar um "profiling" bandeira armazenado em uma sessão, e se meu perfil de avisos de middleware que uma bandeira foi definido, ele usa de Python hotshot módulo como este:
def process_view(self, request, view_func, view_args, view_kwargs):
# setup things here, along with: settings.DEBUG=True
# to get a SQL dump in connection.queries
profiler = hotshot.Profile(fname)
response = profiler.runcall(view_func, request, *view_args, **view_kwargs)
profiler.close()
# process results
return response
EDITAR: Para criar perfis de consultas SQL http://github.com/robhudson/django-debug-toolbar mencionado por Konstantin é uma coisa boa - mas se suas consultas são realmente lentas (provavelmente porque existem centenas ou milhares delas), então você vai ficar esperando uma quantidade insana de tempo até que seja carregado em um navegador - e então será difícil navegar devido à lentidão. Além disso, django-debug-toolbar é por design incapaz de fornecer informações úteis sobre as partes internas das solicitações AJAX.
EDIT2: django-extensions tem um ótimo comando de criação de perfil integrado:
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
Basta fazer isso e voila:
$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
python manage.py runprofileserver --prof-path=/path/to/dir
, siga este blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
foi descontinuado e removido no Python 3, então esta resposta e a ProfilingDjango
página Wiki podem não ser mais relevantes em 20202.
Para perfis de acesso a dados (que é onde o gargalo está na maior parte do tempo) verifique django-live-profiler . Ao contrário do Django Debug Toolbar, ele coleta dados em todas as solicitações simultaneamente e você pode executá-lo em produção sem muita sobrecarga de desempenho ou expor o interior do seu aplicativo.
Plug in vergonhoso aqui, mas recentemente fiz https://github.com/django-silk/silk para esse propósito. É um pouco semelhante à barra de ferramentas django, mas com histórico, perfil de código e controle mais refinado sobre tudo.
Para todos os fãs do KCacheGrind, acho muito fácil usar o shell em conjunto com o teste fantástico do Django Client
para gerar logs de perfil em tempo real, especialmente na produção. Eu usei essa técnica em várias ocasiões porque ela tem um toque leve - nenhum middleware incômodo ou aplicativos Django de terceiros são necessários!
Por exemplo, para criar o perfil de uma determinada visualização que parece estar lenta, você pode abrir o shell e digitar este código:
from django.test import Client
import hotshot
c = Client()
profiler = hotshot.Profile("yourprofile.prof") # saves a logfile to your pwd
profiler.runcall(c.get, "/pattern/matching/your/view/")
profiler.close()
Para visualizar o log resultante, usei hotshot2cachegrind:
Mas também existem outras opções:
Quando as visualizações não são HTML, por exemplo JSON, use métodos de middleware simples para criação de perfil.
Aqui estão alguns exemplos:
https://gist.github.com/1229685 - captura todas as chamadas sql entradas na visualização
https://gist.github.com/1229681 - perfil de todas as chamadas de método usadas para criar a visualização
Eu precisei criar o perfil de um aplicativo Django recentemente e tentei muitas dessas sugestões. Acabei usando pyinstrument vez , que pode ser adicionado a um aplicativo de Django usando uma única atualização para a lista de middleware e fornece uma visão baseada em pilha dos horários.
Resumo rápido da minha experiência com algumas outras ferramentas:
pyinstrument
cProfile
temporizações e exibe automaticamente as temporizações do Ajax, sendo que ambas podem ser muito úteis.Comparado com as outras ferramentas que experimentei, pyinstrument
era muito mais fácil de instalar e usar.