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