Ich denke, es ist eine gute Praxis, sich das Profil anzusehen und den Test zu schreiben, wenn eine Reihe von Verfahren implementiert werden. Eine zu frühe Optimierung ist nicht gut, aber nur das Erkennen eines kleinen Engpasses, bevor ein Leistungsproblem auftritt, gibt Ihnen den Spielraum, "jederzeit abzustimmen".
# 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
#Die Funktion, die Sie im Profil sehen möchten
from app.models import func_to_profile
prf = cProfile.Profile()
prf.runcall(func_to_profile)
pstats.Stats(prf
).sort_stats('time' #Interne Zeitsortierung in absteigender Reihenfolge
).print_stats(.03) #Die Besten 3%Zeige nur
Die Ergebnisanzeige sieht folgendermaßen aus
$ 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)
Wenn man das Ergebnis betrachtet, scheint es schwierig zu sein, die SQLite-Daten auf "datetime" zu analysieren. Sie sehen, dass es möglich ist, Maßnahmen zu ergreifen, z. B. die zu analysierenden Spalten im Notfall einzugrenzen.
Recommended Posts