Es gibt viele Einführungsartikel für Anfänger, aber es gibt nicht viele Themen wie dieses, daher ist es privat Django-Projekt Ich beschloss, eine Kombination aus dem Wissen zu schreiben, das ich hatte, als ich an der Übersetzung beteiligt war, und dem Wissen über den Teil, der ursprünglich übersetzt wurde.
Als Präzedenzfall auf Qiita veröffentlicht
Da es sich jedoch um einen Artikel im Jahr 2016 handelte, möchte ich ihn gemäß dem Umfang des offiziellen Dokuments von Django 3.0 schreiben.
Viele Django-Benutzer sind sich bewusst, ob die Logik beim Schreiben von Code korrekt funktioniert. Dies allein reicht jedoch nicht aus, um Apps mit Django effizient zu erstellen.
Die effiziente Verbesserung der Leistung bei gleichzeitiger Beibehaltung der Logikausgabe ist ein sehr wichtiger Punkt bei der Entwicklung einer Anwendung.
In vielen Fällen führt die Effizienz in einem Bereich zu einer besseren Leistung in anderen Bereichen. Dies ist jedoch nicht immer der Fall. Oft verbessert ein Bereich die Leistung auf Kosten des anderen. Ein Paradebeispiel ist beispielsweise der Verbrauch von mehr Speicher, wenn Sie versuchen, ein Programm zu beschleunigen.
Im schlimmsten Fall kann der Speicher verbraucht werden, um die Geschwindigkeit des Programms zu verbessern, was zu Speichermangel führt. Man kann sagen, dass dieser Fall schädlich ist und keinen Vorteil hat. Beachten Sie diese Kompromisse, wenn Sie die Leistung verbessern.
Daher müssen Sie wissen, was der Zweck der Leistungsverbesserung ist. Sie müssen auch wissen, ob es einen guten Grund für die von Ihnen angestrebte Richtlinie gibt.
Es ist keine gute Idee, sich eine gute oder schlechte Leistung in Ihrem Code vorzustellen und danach zu suchen. Da es in Django viele Tools gibt, ist django-debug-toolbar ein sehr nützliches Tool. Vor allem die Möglichkeit, die von der Seite generierten SQL-Abfragen und deren Ausführungszeit anzuzeigen, ist für die Leistungsoptimierung sehr nützlich.
Es gibt andere Tools, mit denen die Leistung von Websites von Drittanbietern analysiert werden kann. Diese Dienste dienen jedoch nicht zur Diagnose der Codeleistung, sondern beschränken sich auf die standortweite Leistungsdiagnose.
Als typischer Service
Und so weiter.
Oft ist die Berechnung des Wertes kostspielig (das heißt, es verbraucht viele Ressourcen und ist langsam). Daher werden die Werte in einem leicht zugänglichen Cache gespeichert, damit sie bei der nächsten Verwendung abgerufen werden können.
Dies ist eine wichtige und leistungsstarke Technik, und Django enthält ein umfassendes Caching-Framework und einige kleine Caching-Funktionen.
Das Caching-Framework in Django verbessert die Leistung erheblich, indem dynamischer Inhalt gespeichert und eine Neuberechnung bei jeder Anforderung vermieden wird.
Um flexibler zu sein, bietet Django verschiedene Ebenen der Cache-Granularität mit einem breiten Spektrum an Unterstützung, vom Zwischenspeichern der Ausgabe einer bestimmten Ansicht bis zum Zwischenspeichern der gesamten Site.
Die Caching-Implementierung ist schlecht geschrieben und sollte nicht als Alternative zu fehlerhaftem Code erkannt werden. Daher ist es eine der letzten Methoden, die bei der Leistungsoptimierung berücksichtigt werden müssen.
Verwenden Sie "cached_property", wenn Sie eine Methode einer Instanz einer Klasse mehrmals aufrufen müssen und sie eine Menge Ressourcen verbraucht, um sie auszuführen.
Verwenden Sie cached_property
, um den von der Eigenschaft zurückgegebenen Wert zu speichern und den im Cache gespeicherten Wert zurückzugeben, wenn die Funktion in derselben Instanz erneut aufgerufen wird.
Beachten Sie, dass dieser Dekorator nur funktioniert, wenn die Methode nur "self" als Argument verwendet und die Methode an eine Eigenschaft zurückgegeben werden kann.
Während der Cache Werte wie oben beschrieben speichert, ist Faulheit eine Technik, die die Ausführung von Berechnungen absichtlich verzögert, bis die Werte tatsächlich benötigt werden.
Durch die Verwendung dieser Technologie kann vor der Instanziierung auf sie verwiesen werden, sodass sie viele Verwendungszwecke hat. Beispielsweise wird Verzögerte Übersetzung ausgeführt, bis die übersetzte Zeichenfolge in einer gerenderten Vorlage usw. benötigt wird. Es hat den Vorteil, dass es verwendet werden kann, noch bevor die Sprache bekannt ist.
Verzögerungen sind auch eine Möglichkeit, Aufwand zu sparen, indem Sie versuchen, Arbeit zu vermeiden, und nichts tun, bis Sie den oben genannten Wert tatsächlich benötigen. Mit anderen Worten, je mehr Ressourcen Sie für verwandte Arbeiten ausgeben, desto größer sind die Vorteile von Verzögerungen.
Python ist eine Reihe von Tools für die verzögerte Auswertung mithilfe von Generatoren und Generatorausdruckskomponenten (https://docs.python.org/en/3/reference/expressions.html#generator-expressions). Ist vorbereitet. Wenn Sie Verzögerungsmuster in Ihrem Code nutzen möchten, lesen Sie Informationen zu Python-Verzögerungen für einen breiteren Anwendungsbereich.
Ein gutes Beispiel für die Verzögerung von Django ist die Auswertung von "QuerySet". QuerySet
ist verzögert. Daher können Sie ein "QuerySet" erstellen und es in Kombination mit anderen "QuerySet" übergeben. Sie müssen nicht auf die Datenbank zugreifen und die beschriebenen Elemente abrufen. Sie übergeben ein QuerySet-Objekt, keine Sammlung von Elementen, die Sie letztendlich aus der Datenbank benötigen.
Andererseits erzwingen bestimmte Operationen die Auswertung von "QuerySet". Indem Sie die Auswertung von "QuerySet" bewusst vermeiden, können Sie teure und unnötige Fahrten in die Datenbank vermeiden.
Django bietet auch einen keep_lazy () Dekorateur
. Dies führt dazu, dass sich die mit dem verzögerten Argument aufgerufene Funktion verzögert verhält und nur bei Bedarf ausgewertet wird. Daher wird es erst zur Bewertung aufgerufen, wenn das Argument, das Sie verzögern möchten, unbedingt angefordert wird.
Wir empfehlen Ihnen einen Blick darauf zu werfen. Es ist sehr wichtig, bei der Optimierung auf Abfragen und deren Kosten zu achten und sich über das DBMS zu informieren, das Sie für Datenbanken verwenden.
Django verfügt über die folgende Middleware zur Verbesserung der Site-Leistung.
ConditionalGetMiddleware bietet GET-Antwortunterstützung für moderne Browser, die auf ETag- und Last-Modified-Headern basieren Hinzufügen.
GZip Middleware komprimiert die Reaktion aller modernen Browser und spart Bandbreite und Übertragungszeit. Ich werde.
Zwischengespeicherte Sitzungen machen das Lesen von Sitzungsdaten aus langsameren Speicherquellen wie Datenbanken überflüssig, wodurch die Leistung verbessert werden kann.
Statische Dateien sind eines der zu optimierenden Ziele, und Django verfügt über die folgenden Funktionen.
ManifestStaticFileStorage wird für lange Zeit zwischengespeichert, indem dem statischen Dateinamen ein Tag hinzugefügt wird. Ich werde es schaffen. Wenn die Datei geändert wird, wird auch das Tag geändert, sodass der Browser automatisch aktualisiert wird, um die statische Datei neu zu laden.
Minification
Einige Django-Tools und -Pakete von Drittanbietern bieten HTML-, CSS- und JavaScript-Minimierungsfunktionen ("Minify"). Diese reduzieren die Größe des von der Site veröffentlichten Dokuments, indem unnötige Leerzeichen, Zeilenumbrüche und Kommentare entfernt und die Variablennamen verkürzt werden.
Wenn Sie den zwischengespeicherten Vorlagenlader aktivieren (https://docs.djangoproject.com/de/3.0/ref/templates/api/#django.template.loaders.cached.Loader), kann dies die Leistung erheblich verbessern Es gibt viele. Mit diesem Loader müssen Sie nicht jedes Mal jede Vorlage kompilieren, wenn Sie die Vorlagen rendern müssen.
Es ist eine gute Idee zu prüfen, ob verschiedene, leistungsstärkere Versionen der von Ihnen verwendeten Software verfügbar sind.
Diese Technik richtet sich bereits an Benutzer, die die Leistung einer vollständig optimierten Django-Site weiter verbessern möchten. Dies sind keine magischen Lösungen für Leistungsprobleme, sie machen die Grundlagen richtig. Denken Sie daran, dass es unwahrscheinlich ist, dass Sie mehr als Ihre Grenzen auf eine Website bringen, die Sie nicht haben.
In den meisten Fällen ist die in Django integrierte Vorlagensprache vollkommen angemessen. Wenn Sie jedoch der Meinung sind, dass der Engpass Ihres Django-Projekts im Vorlagensystem liegt und es keine andere Möglichkeit gibt, dies zu beheben, wenden Sie sich an einen Dritten Möglicherweise können Sie es mit einem Tool verbessern.
Beispielsweise kann Jinja2 verwendet werden, um die Leistung, insbesondere die Geschwindigkeit, zu verbessern.
Alternative Vorlagensysteme unterscheiden sich darin, inwieweit die Vorlagensprache von Django gemeinsam genutzt wird.
Es ist wichtig zu beachten, dass Sie bei Leistungsproblemen mit Ihrer Vorlage zunächst genau herausfinden sollten, warum und die Verwendung eines alternativen Vorlagensystems sich als schneller erweisen kann. Ja, aber das gleiche Problem ist möglicherweise verfügbar, ohne das Problem zu beheben. Beispielsweise können Sie teure Vorlagenverarbeitung und Logik in einer Ansicht effizienter ausführen.
Es ist eine gute Idee zu überprüfen, ob die von Ihnen verwendete Python-Software von einer anderen Implementierung bereitgestellt wird, die denselben Code schneller ausführen kann.
Die meisten Leistungsprobleme bei einer gut gestalteten Django-Site sind jedoch ineffiziente Datenbankabfragen, Caches und Vorlagen, nicht auf der Python-Ausführungsebene. Bei schlechtem Python-Code werden Leistungsprobleme selten dadurch gelöst, dass der Code schneller ausgeführt wird.
Alternative Implementierungen können Kompatibilitäts-, Bereitstellungs-, Portabilitäts- oder Wartungsprobleme verursachen. Vor der Einführung einer nicht standardmäßigen Implementierung müssen Sie natürlich sicherstellen, dass Ihre Anwendung ausreichende Leistungssteigerungen bietet, um die potenziellen Risiken aufzuwiegen.
Beachten Sie unter Berücksichtigung dieser Einschränkungen Folgendes:
PyPy ist eine Implementierung in Python (die "Standard" -Python-Implementierung ist in C). PyPy kann die Leistung erheblich verbessern, normalerweise in großen Anwendungen.
Der Hauptzweck des PyPy-Projekts ist Kompatibilität mit vorhandenen Python-APIs und -Bibliotheken. Bitte beachten Sie, dass Django kompatibel ist, Sie jedoch die Kompatibilität mit anderen abhängigen Bibliotheken überprüfen müssen.
Das ist es. Ich habe die Grundlagen zusammengefasst und denke darüber nach, einen Weg zu finden, um jeden Inhalt tatsächlich vorzustellen und die Leistung zu verbessern.
Recommended Posts