¿Cómo perfilar la aplicación django con respecto al tiempo de ejecución?

Mi aplicación Django es increíblemente lenta, quiero averiguar qué está tomando tiempo:

Intenté Django-debug-toolbar pero no pude encontrar un panel que me permitiera separarme del tiempo de carga.

Mis requerimientos:

  • Una salida de tipo stack-trace con tiempo de ejecución para cada módulo llamado para renderizar la página.
  • Quiero darme cuenta de qué parte de todo el proceso de representación de la página se está demorando.
  • Además, ¿qué parte consume la cantidad de CPU [MÁS IMPORTANTE]?

¿Puede django-debug-toolbar hacer eso? [¿Qué panel? ]

¿Alguna otra aplicación de django que pueda hacer eso?

Puedes probar el panel de perfiles de la barra de herramientas django-debug (asegúrate de usar la última versión de la aplicación desde github ). Habilite el panel así en su configuración.py:

 DEBUG_TOOLBAR_PANELS = ( 'debug_toolbar.panels.version.VersionDebugPanel', 'debug_toolbar.panels.timer.TimerDebugPanel', 'debug_toolbar.panels.profiling.ProfilingDebugPanel', ) 

Esta existencia de este panel no está documentada en el archivo léame de django-debug-toolbar; Es por eso que respondo aquí en primer lugar.

EDITAR : Si está utilizando django-debug-toolbar v1.0 y se ha cambiado el nombre del panel a debug_toolbar.panels.profiling.ProfilingPanel y ahora está documentado aquí http://django-debug-toolbar.readthedocs.org/en /1.0/panels.html#non-default-built-in-panels . Todavía no está habilitado por defecto.

Finalmente encontré una manera de perfilar mi aplicación web django:

Los siguientes 2 fragmentos de código Django proporcionan middleware que perfila todo el flujo y las salidas si la solicitud tiene prof en las GET keys :

Perfil simple y simple – ¡Salvé mi día!

Recomendaría escribir algunas pruebas de integración en su lugar, o al menos usar el cliente de prueba integrado para automatizar las solicitudes y poner muchas declaraciones de depuración en las vistas

Django tiene un cliente de prueba integrado:

 from django.test.client import Client c = Client() response = c.post('/slow_url/') 

Y luego en su opinión:

 def slow_url(request): start = time.time() print 'Started db query' result = SomeComplexModel.objects.all() print 'Finished db query, took ', time.time() - start return render('some_complex_template.html', {'result': result}) 

Automatizar el proceso de realizar solicitudes y poder replicarlas una y otra vez mientras realiza pequeños cambios es cómo mejorará su código. El tiempo de CPU se puede calcular si mide el tiempo que lleva ejecutar cada función. No le llevará mucho tiempo concentrarse en la parte que en realidad está consumiendo recursos.

No es la creación de perfiles, pero generalmente solo uso una vista para calcular el tiempo de ejecución, también funciona para las vistas que necesitan inicio de sesión del usuario, muestra el tiempo de ejecución en una página simple

  def test(request): from django.test.client import Client import time c = Client() #client login if needed response = c.post('/login/', {'username': 'admin', 'password': 'password'}) start = time.time() response = c.get('/pagetotest/') #print response #print 'Finished, time: ', time.time() - start # output to console end=time.time() - start return render(request,'loadingtime.html',{'time':end}) 

Creo que es un buen comienzo, espero que ayude a alguien.

Django-seda puede ayudar.

  • Instálalo con: pip install django-silk
  • Agrégalo en settings.py :
 MIDDLEWARE = [ ... 'silk.middleware.SilkyMiddleware', ... ] INSTALLED_APPS = ( ... 'silk' ) 
  • Agregue la ruta en urls.py :
 urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))] 
  • Finalmente, cree las tablas adecuadas en la base de datos con:
 python manage.py makemigrations python manage.py migrate 

Luego puede navegar en su navegador de Internet a /silk para encontrar la página solicitada allí.