[PYTHON] Un aperçu rapide de votre profil dans l'appli django

Je pense que c'est une bonne pratique de jeter un œil au profil ainsi que d'écrire le test lors de la mise en œuvre d'un tas de procédures. Optimiser trop tôt n'est pas une bonne chose, mais le simple fait de reconnaître un petit goulot d'étranglement avant qu'un problème de performances ne devienne apparent vous donne la possibilité de «régler à tout moment».

# coding:utf-8

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

import django
django.setup()


if __name__ == "__main__":
    """
    $ cd /path/to/project
    $ python -m project.profile
    """
    import cProfile
    import pstats

    #La fonction que vous souhaitez voir dans le profil
    from app.models import func_to_profile

    prf = cProfile.Profile()
    prf.runcall(func_to_profile)
    pstats.Stats(prf
        ).sort_stats('time'  #Tri temporel interne par ordre décroissant
        ).print_stats(.03)   #Top 3%Montrer seulement

L'affichage des résultats ressemble à ceci

$ python -m project.profile
         9109096 function calls (8991335 primitive calls) in 8.224 seconds

   Ordered by: internal time
   List reduced from 463 to 14 due to restriction <0.03>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   125620    0.723    0.000    0.723    0.000 /path/to/django/utils/dateparse.py:107(<dictcomp>)
    62810    0.631    0.000    0.805    0.000 /path/to/django/db/models/base.py:388(__init__)
   125620    0.435    0.000    1.702    0.000 /path/to/django/utils/dateparse.py:84(parse_datetime)
   265490    0.395    0.000    0.640    0.000 /path/to/django/db/models/fields/related.py:1619(local_related_fields)
      670    0.339    0.001    3.027    0.005 {method 'fetchmany' of 'sqlite3.Cursor' objects}
   125620    0.292    0.000    2.242    0.000 /path/to/django/db/backends/sqlite3/utils.py:6(parse_datetime_with_timezone_support)
   279460    0.291    0.000    0.474    0.000 /path/to/django/db/models/fields/related.py:1633(get_instance_value_for_fields)
   265490    0.205    0.000    1.209    0.000 /path/to/django/db/models/fields/related.py:1627(get_local_related_value)
   549522    0.199    0.000    0.199    0.000 {hasattr}
   127330    0.198    0.000    0.198    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
672800/561660    0.194    0.000    0.423    0.000 {setattr}
   127330    0.175    0.000    0.175    0.000 {method 'groupdict' of '_sre.SRE_Match' objects}
    55570    0.157    0.000    0.263    0.000 /path/to/django/db/models/fields/related.py:615(__set__)
   376960    0.154    0.000    0.254    0.000 /path/to/django/db/models/fields/related.py:1609(related_fields)(app)


En regardant le résultat, il semble qu'il soit difficile d'analyser les données sqlite en datetime. Vous pouvez voir qu'il est possible de prendre des mesures telles que la réduction des colonnes à analyser en cas d'urgence.

Recommended Posts

Un aperçu rapide de votre profil dans l'appli django
Initialiser l'application Django
Essayez de créer une application Todo avec le framework Django REST
Regardez de plus près le tutoriel Kaggle / Titanic
Essayez d'utiliser le framework Web Python Django (2) - Regardez setting.py
Jetez un œil à l'arborescence des exceptions intégrée à Python
Profil dans une méthode de la classe
Jetons un coup d'œil à la carte des fonctionnalités de YOLO v3
Jetez un œil à l'arborescence des exceptions intégrée dans Python 3.8.2
Implémenter l'application Django sur Hy
L'histoire d'avoir un regard doux et douloureux sur les utilisateurs personnalisés sur Django
Créez un modèle pour votre planning Django
Déployer l'application Django sur Heroku [Partie 2]
Déployer l'application Django sur Heroku [Partie 1]
Création de la première application avec Django startproject
Jetons un coup d'œil au code Scapy. Comment traitez-vous la structure?