Antworten:
Probieren Sie die Django Debug-Symbolleiste aus . Es zeigt Ihnen, welche Abfragen auf jeder Seite ausgeführt werden und wie viel Zeit sie in Anspruch nehmen. Es ist ein wirklich nützliches, leistungsstarkes und einfach zu bedienendes Tool.
Lesen Sie auch die Empfehlungen zur Django-Leistung bei der Optimierung des Datenbankzugriffs des der Dokumentation.
Und Django Performance-Tipps von Jacob Kaplan-Moss.
Geben Sie einfach "django-profiling" bei Google ein, Sie erhalten folgende Links (und mehr):
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/
Persönlich verwende ich den Middleware-Ansatz - dh jeder Benutzer kann ein in einer Sitzung gespeichertes "Profiling" -Flag umschalten. Wenn meine Profiling-Middleware feststellt, dass ein Flag gesetzt wurde, wird Pythons Hotshot verwendet Modul:
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
BEARBEITEN: Zum Profilieren von SQL-Abfragen die von Konstantin erwähnte http://github.com/robhudson/django-debug-toolbar eine nette Sache - aber wenn Ihre Abfragen wirklich langsam sind (wahrscheinlich, weil es Hunderte oder Tausende von ihnen gibt), dann Sie Ich werde wahnsinnig lange warten, bis es in einen Browser geladen wird - und dann wird es aufgrund der Langsamkeit schwierig sein, es zu durchsuchen. Außerdem kann die django-debug-Symbolleiste von Natur aus keinen nützlichen Einblick in die Interna von AJAX-Anforderungen geben.
EDIT2: Django-Erweiterungen verfügt über einen großartigen Profiling-Befehl:
https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst
Mach das einfach und 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
, folgen Sie diesem Blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
in Python 3 veraltet und entfernt wurde, sodass diese Antwort und die ProfilingDjango
Wiki-Seite im Jahr 20202 möglicherweise nicht mehr relevant sind.
Informationen zum Profiling des Datenzugriffs (wo der Engpass die meiste Zeit besteht) finden Sie im django-live-profiler . Im Gegensatz zur Django Debug-Symbolleiste werden Daten über alle Anforderungen hinweg gleichzeitig erfasst, und Sie können sie in der Produktion ausführen, ohne zu viel Leistungsaufwand zu verursachen oder Ihre App-Interna verfügbar zu machen.
Schamloser Stecker hier, aber ich habe kürzlich https://github.com/django-silk/silk für diesen Zweck erstellt. Es ist der Django-Symbolleiste etwas ähnlich, aber mit Verlauf, Code-Profilerstellung und feiner Kontrolle über alles.
Für alle KCacheGrind-Fans ist es sehr einfach, die Shell zusammen mit Djangos fantastischem Test zu verwenden Client
zum , insbesondere in der Produktion. Ich habe diese Technik jetzt schon mehrmals verwendet, weil sie sich leicht anfühlt - es sind keine lästigen Middleware- oder Django-Anwendungen von Drittanbietern erforderlich!
Um beispielsweise eine bestimmte Ansicht zu profilieren, die langsam zu laufen scheint, können Sie die Shell aufbrechen und diesen Code eingeben:
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()
Um das resultierende Protokoll zu visualisieren, habe ich hotshot2cachegrind verwendet:
Es gibt aber auch andere Möglichkeiten:
Wenn die Ansichten nicht HTML sind, z. B. JSON, verwenden Sie einfache Middleware-Methoden für die Profilerstellung.
Hier einige Beispiele:
https://gist.github.com/1229685 - Erfassung aller SQL-Aufrufe wurde in die Ansicht aufgenommen
https://gist.github.com/1229681 - Profil aller Methodenaufrufe, die zum Erstellen der Ansicht verwendet wurden
Ich musste kürzlich eine Django-App profilieren und habe viele dieser Vorschläge ausprobiert. Stattdessen habe ich pyinstrument verwendet , das mit einem einzigen Update der Middleware-Liste zu einer Django-App hinzugefügt werden kann und eine stapelbasierte Ansicht der Timings bietet.
Kurze Zusammenfassung meiner Erfahrungen mit einigen anderen Tools:
pyinstrument
cProfile
Timings zuzugreifen, und zeigt automatisch Ajax-Timings an, die beide sehr hilfreich sein können.Im Vergleich zu den anderen Tools, die ich ausprobiert habe, pyinstrument
war die Installation und Verwendung erheblich einfacher.