Risposte:
Prova la barra degli strumenti di debug di Django . Ti mostrerà quali query vengono eseguite su ciascuna pagina e quanto tempo impiegano. È uno strumento davvero utile, potente e facile da usare.
Inoltre, leggi i consigli sulle prestazioni di Django nell'ottimizzazione dell'accesso al database dalla documentazione.
E i suggerimenti per l' esecuzione di Django di Jacob Kaplan-Moss.
Basta digitare "django-profiling" su google, otterrai questi link (e altro):
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/
Personalmente sto utilizzando l'approccio middleware, ovvero ogni utente può attivare o disattivare un flag di "profilazione" memorizzato in una sessione, e se il mio middleware di profilazione nota che è stato impostato un flag, utilizza il modulo hotshot di Python in questo modo:
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
EDIT: per la profilazione delle query SQL http://github.com/robhudson/django-debug-toolbar menzionata da Konstantin è una cosa carina, ma se le tue query sono molto lente (probabilmente perché ce ne sono centinaia o migliaia), allora tu Aspetterò una folle quantità di tempo prima che venga caricato in un browser, dopodiché sarà difficile navigare a causa della lentezza. Inoltre, django-debug-toolbar non è in grado di fornire informazioni utili sugli interni delle richieste AJAX.
EDIT2: django-extensions ha un ottimo comando di profilazione integrato:
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
Basta fare questo e voilà:
$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
python manage.py runprofileserver --prof-path=/path/to/dir
, segui questo blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
è stato deprecato e rimosso in Python 3, quindi questa risposta e la ProfilingDjango
pagina Wiki potrebbero non essere più rilevanti nel 20202.
Per l'accesso ai dati di profilazione (che è dove il collo di bottiglia è la maggior parte del tempo) controlla django-live-profiler . A differenza di Django Debug Toolbar, raccoglie i dati su tutte le richieste contemporaneamente e puoi eseguirlo in produzione senza un sovraccarico eccessivo delle prestazioni o esponendo le parti interne dell'app.
Spudorato plug qui, ma di recente ho creato https://github.com/django-silk/silk per questo scopo. È in qualche modo simile alla barra degli strumenti di django ma con cronologia, profilazione del codice e controllo più dettagliato su tutto.
Per tutti voi fan di KCacheGrind, trovo che sia molto facile usare la shell in tandem con il fantastico test di Django Client
per generare al volo i log dei profili, specialmente in produzione. Ho usato questa tecnica in diverse occasioni perché ha un tocco leggero: non sono richiesti fastidiosi middleware o applicazioni Django di terze parti!
Ad esempio, per profilare una vista particolare che sembra funzionare lentamente, potresti aprire la shell e digitare questo codice:
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()
Per visualizzare il registro risultante, ho usato hotshot2cachegrind:
Ma ci sono anche altre opzioni:
Quando le visualizzazioni non sono HTML, ad esempio JSON, utilizzare metodi middleware semplici per la profilazione.
Ecco un paio di esempi:
https://gist.github.com/1229685 - cattura tutte le chiamate sql entrate nella visualizzazione
https://gist.github.com/1229681 - profila tutte le chiamate ai metodi utilizzate per creare la vista
Di recente avevo bisogno di creare il profilo di un'app Django e ho provato molti di questi suggerimenti. Ho finito per usare invece pyinstrument , che può essere aggiunto a un'app Django utilizzando un singolo aggiornamento all'elenco middleware e fornisce una visualizzazione basata sullo stack dei tempi.
Breve riepilogo della mia esperienza con altri strumenti:
pyinstrument
cProfile
tempi e visualizza automaticamente i tempi ajax, entrambi i quali possono essere davvero utili.Rispetto agli altri strumenti che ho provato, è pyinstrument
stato notevolmente più facile da installare e da utilizzare.