[PYTHON] Optimisation des performances dans Django 3.xx

Aperçu

Il existe de nombreux articles d'introduction pour les débutants, mais il n'y a pas beaucoup de sujets comme celui-ci, donc c'est privé projet Django J'ai décidé d'écrire une combinaison des connaissances que j'avais lorsque j'étais impliqué dans la traduction et des connaissances de la partie qui avait été traduite à l'origine.

Comme exemple précédent publié sur Qiita

Cependant, comme il s'agissait d'un article en 2016, j'aimerais l'écrire selon la portée du document officiel de Django 3.0.

Réglage général des performances

De nombreux utilisateurs de Django savent si la logique fonctionne correctement lors de l'écriture de code. Cependant, cela seul ne suffit pas pour créer des applications efficacement avec Django.

Comment améliorer efficacement les performances tout en conservant la sortie de la logique est un point très important dans le développement d'une application.

Dans de nombreux cas, l'efficacité dans un domaine conduit à de meilleures performances dans d'autres domaines. Par contre, ce n'est pas toujours le cas. Souvent, un domaine améliore les performances au détriment de l'autre. Par exemple, consommer plus de mémoire en essayant d'accélérer un programme est un excellent exemple.

Dans le pire des cas, la mémoire peut être utilisée pour tenter d'améliorer la vitesse du programme, entraînant un manque de mémoire. On peut dire que ce cas est nuisible et n'a aucun avantage. Soyez conscient de ces compromis lors de l'amélioration des performances.

Par conséquent, vous devez savoir quel est le but de l'amélioration des performances. Vous devez également savoir s'il existe une bonne raison pour la politique que vous visez.

référence

Ce n'est pas une bonne idée d'imaginer et de rechercher de bonnes ou de mauvaises performances dans votre code. Parce qu'il existe de nombreux outils dans Django, parmi eux django-debug-toolbar est un outil très utile. Surtout, la possibilité d'afficher les requêtes SQL générées par la page et le temps d'exécution de chacune est très utile pour le réglage des performances.

Il existe d'autres outils permettant d'analyser les performances des sites tiers. Cependant, ces services ne sont pas destinés à diagnostiquer les performances du code, ils sont limités aux diagnostics des performances à l'échelle du site.

En tant que service typique

Etc.

Tuning dans Django

mise en cache

Souvent, le calcul de la valeur est coûteux (c'est-à-dire qu'il consomme beaucoup de ressources et est lent). Par conséquent, les valeurs sont stockées dans un cache facilement accessible afin qu'elles puissent être récupérées la prochaine fois qu'elles sont nécessaires.

C'est une technique importante et puissante, et Django inclut un cadre de mise en cache complet et quelques petites fonctionnalités de mise en cache.

Caching Framework

Le cadre de mise en cache de Django améliore considérablement les performances en stockant le contenu dynamique et en évitant le recalcul à chaque demande.

Pour être plus flexible, Django propose différents niveaux de granularité de mise en cache, avec une large gamme de support, de la mise en cache de la sortie d'une vue particulière à la mise en cache de l'ensemble du site, par exemple.

L'implémentation de la mise en cache est mal écrite et ne doit pas être reconnue comme une alternative au mauvais code. Par conséquent, c'est l'une des dernières méthodes à prendre en compte lors du réglage des performances.

cached_property

Utilisez cached_property si vous devez appeler plusieurs fois une méthode d'une instance d'une classe et que cela consomme beaucoup de ressources pour l'exécuter.

Utilisez cached_property pour enregistrer la valeur renvoyée par la propriété et renvoyer la valeur stockée dans le cache lorsque la fonction est à nouveau appelée sur la même instance.

Notez que ce décorateur ne fonctionne que si la méthode prend uniquement «self» comme argument et que la méthode peut être retournée à une propriété.

retard

Alors que le cache stocke les valeurs comme décrit ci-dessus, la paresse est une technique qui retarde délibérément l'exécution des calculs jusqu'à ce que les valeurs soient réellement nécessaires.

En utilisant cette technologie, il peut être référencé avant l'instanciation, il a donc de nombreuses utilisations. Par exemple, Traduction différée s'exécute jusqu'à ce que la chaîne traduite soit nécessaire dans un modèle rendu, etc. Il a l'avantage de pouvoir être utilisé avant même que la langue ne soit connue.

En outre, les retards sont un moyen d'économiser des efforts en essayant d'éviter le travail et ne rien faire tant que vous n'avez pas réellement besoin de la valeur, comme mentionné ci-dessus. En d'autres termes, plus vous dépensez de ressources sur des travaux connexes, plus les avantages du retard sont importants.

Python est un certain nombre d'outils pour l'évaluation paresseuse à l'aide de générateurs et de composants d'expression de générateur (https://docs.python.org/en/3/reference/expressions.html#generator-expressions) Est préparé. Si vous souhaitez tirer parti des modèles de retard dans votre code, lisez les délais Python pour une plus large gamme d'utilisations.

Retard à Django

Un bon exemple du retard de Django est l'évaluation de QuerySet. QuerySet est retardé. Par conséquent, vous pouvez créer un QuerySet et le transmettre en combinaison avec d'autresQuerySets. Vous n'avez pas à accéder à la base de données et à récupérer les éléments décrits, vous transmettez un objet QuerySet, pas une collection d'éléments dont vous avez finalement besoin de la base de données.

En revanche, certaines opérations forcent l'évaluation de «QuerySet». En évitant délibérément l'évaluation de «QuerySet», vous pouvez éviter des déplacements coûteux et inutiles vers la base de données.

Django fournit également un décorateur keep_lazy (). Cela provoque le comportement différé de la fonction appelée avec l'argument différé et son évaluation uniquement lorsque cela est nécessaire. Par conséquent, il ne sera pas appelé pour évaluation tant que l'argument que vous souhaitez retarder ne sera pas strictement demandé.

Base de données

Nous vous recommandons de jeter un œil à. Il est très important de faire attention aux requêtes et à leurs coûts en matière d'optimisation, et de prendre connaissance du SGBD que vous utilisez pour les bases de données.

Performances HTTP

Middleware

Django dispose du middleware suivant pour améliorer les performances du site.

ConditionalGetMiddleware prend en charge la réponse GET aux derniers navigateurs basés sur ETag et l'en-tête Last-Modified Ajouter.

GZip Middleware compresse la réponse de tous les navigateurs modernes, économisant de la bande passante et du temps de transfert. Je vais.

session

Les sessions mises en cache éliminent le besoin de lire les données de session à partir de sources de stockage plus lentes telles que les bases de données, ce qui peut améliorer les performances.

Fichier statique

Les fichiers statiques sont l'une des cibles à optimiser et Django a les fonctions suivantes.

ManifestStaticFileStorage met en cache pendant longtemps en ajoutant une balise au nom du fichier statique. Je pourrai le faire. Si le fichier est modifié, la balise sera également modifiée, de sorte que le navigateur sera automatiquement mis à jour pour recharger le fichier statique.

Minification

Certains outils et packages Django tiers fournissent des fonctionnalités de minimisation HTML, CSS et JavaScript («minify»). Ceux-ci réduisent la taille du document publié par le site en supprimant les espaces blancs inutiles, les sauts de ligne et les commentaires et en raccourcissant les noms des variables.

Performance du modèle

point important

--{% bloak%}est plus rapide que{% include%}.

Chargeur de modèles de cache

Si l'activation du chargeur de modèles mis en cache (https://docs.djangoproject.com/en/3.0/ref/templates/api/#django.template.loaders.cached.Loader) peut considérablement améliorer les performances Il y a beaucoup de. Ce chargeur vous évite d'avoir à compiler chaque modèle à chaque fois que vous devez rendre les modèles.

Utilisation de différentes versions des logiciels disponibles

C'est une bonne idée de vérifier si des versions différentes et plus performantes du logiciel que vous utilisez sont disponibles.

Cette technique s'adresse déjà aux utilisateurs qui souhaitent améliorer encore les performances des sites Django entièrement optimisés, et ce ne sont pas des solutions magiques aux problèmes de performances, ils font bien les bases. Gardez à l'esprit qu'il est peu probable que vous apportiez plus que vos limites à un site que vous n'avez pas.

Alternative au langage de template Django

Dans la plupart des cas, le langage de modèle intégré de Django est parfaitement approprié, mais si vous pensez que le goulot d'étranglement de votre projet Django est dans le système de modèle et qu'il ne semble pas y avoir d'autre moyen de le résoudre, alors un tiers Vous pourrez peut-être l'améliorer avec un outil.

Par exemple, Jinja2 peut être utilisé pour améliorer les performances, en particulier la vitesse.

Les systèmes de modèles alternatifs diffèrent dans la mesure dans laquelle le langage de modèle de Django est partagé.

Il est important de noter que si vous rencontrez des problèmes de performances avec votre modèle, la première chose à faire est de comprendre exactement pourquoi, et l'utilisation d'un autre système de modèle peut s'avérer plus rapide. Oui, mais le même problème peut être disponible sans résoudre le problème. Par exemple, vous pouvez effectuer un traitement de modèle et une logique coûteux plus efficacement dans une vue.

Implémentation logicielle alternative

C'est une bonne idée de vérifier si le logiciel Python que vous utilisez est fourni par une autre implémentation qui peut exécuter le même code plus rapidement.

Cependant, la plupart des problèmes de performances avec des sites Django bien conçus sont des requêtes de base de données, des caches et des modèles inefficaces, et non des niveaux d'exécution Python. Pour un code Python médiocre, les problèmes de performances sont rarement résolus en exécutant le code plus rapidement.

D'autres implémentations peuvent entraîner des problèmes de compatibilité, de déploiement, de portabilité ou de maintenance. Inutile de dire qu'avant d'adopter une implémentation non standard, vous devez vous assurer que votre application offre des gains de performances suffisants pour compenser les risques potentiels.

Avec ces mises en garde à l'esprit, gardez à l'esprit les points suivants:

PyPy est une implémentation en Python (l'implémentation "standard" de Python est en C). PyPy peut améliorer considérablement les performances, généralement dans les grandes applications.

L'objectif principal du projet PyPy est Compatibilité avec les API et bibliothèques Python existantes. Veuillez noter que Django est compatible, mais vous devez vérifier la compatibilité avec d'autres bibliothèques dépendantes.

Résumé

C'est tout. J'ai résumé les bases, donc je pense à écrire un moyen de présenter chaque contenu et d'améliorer les performances.

Recommended Posts

Optimisation des performances dans Django 3.xx
Python en optimisation
Modèle dans Django
Formulaire à Django
Modifications du modèle dans Django
Django haute performance - Modèle
PHP comme var_dump dans le template Django
Gérer les constantes dans les modèles Django
Implémenter la fonction de suivi dans Django
Renommer les colonnes de table dans Django3
Sortie de la structure de table dans Django
(Note) Django dans l'environnement Vagrant
Résoudre les problèmes d'optimisation avec Python
Afficher Django ManyToManyField dans un modèle
recharger dans le shell django avec ipython
Résolution de "cubes en cubes" avec optimisation des combinaisons
Définir des espaces réservés dans les champs de saisie dans Django
8 commandes fréquemment utilisées dans Python Django
Ajouter dynamiquement des champs de formulaire dans Django
Optimisation des paramètres de systole FX en Python
Erreur liée à memcached dans django
Implémentation de la fonction de connexion dans Django
Enregistrer l'application Django dans le projet
GPyOpt, un package d'optimisation bayésienne en Python
Ecrire des contraintes de clé externe dans Django
Comment refléter CSS dans Django
Changer la langue affichée dans Django 1.9
Débogage dans le débogueur / optimisation Houdini Vol.3
Déployez Django en 3 minutes à l'aide de docker-compose
Épingler la valeur de départ factory_boy dans Django
API GraphQL utilisant graphene_django dans Django
Implémentation du bouton like dans Django + Ajax
Techniques d'optimisation combinées vues dans les puzzles
Récupérer la chaîne de requête (chaîne de requête) avec Django
Créer un bot LINE avec Django