QuerySet
Was ist in Django die beste Option zum Zählen der Objekte , da ich eine habe , über die ich iterieren und die Ergebnisse drucken werde? len(qs)
oder qs.count()
?
(Auch da das Zählen der Objekte in derselben Iteration keine Option ist.)
python
django
performance
antonagestam
quelle
quelle
Antworten:
Obwohl die Django-Dokumente die Verwendung empfehlen,
count
anstattlen
:Da Sie dieses QuerySet ohnehin iterieren, wird das Ergebnis zwischengespeichert (sofern Sie es nicht verwenden
iterator
). Daher ist es vorzuziehen, es zu verwendenlen
, da dies verhindert, dass die Datenbank erneut aufgerufen wird und möglicherweise auch eine andere Anzahl von Ergebnissen abgerufen wird !) .Wenn Sie verwenden
iterator
, würde ich aus den gleichen Gründen vorschlagen, eine Zählvariable einzuschließen, während Sie durchlaufen (anstatt count zu verwenden).quelle
Die Wahl zwischen
len()
undcount()
hängt von der jeweiligen Situation ab. Es lohnt sich, genau zu verstehen, wie sie funktionieren, um sie richtig zu verwenden.Lassen Sie mich einige Szenarien vorstellen:
(am wichtigsten) Wenn Sie nur die Anzahl der Elemente wissen möchten und nicht vorhaben, sie in irgendeiner Weise zu verarbeiten, ist es wichtig, Folgendes zu verwenden
count()
:DO:
queryset.count()
- Dies führt eine einzelneSELECT COUNT(*) some_table
Abfrage durch. Alle Berechnungen werden auf der RDBMS-Seite ausgeführt. Python muss nur die Ergebnisnummer mit den festen Kosten von O (1) abrufen.NICHT:
len(queryset)
- Dies führt eineSELECT * FROM some_table
Abfrage durch, ruft die gesamte Tabelle O (N) ab und benötigt zusätzlichen O (N) -Speicher zum Speichern. Dies ist das Schlimmste, was getan werden kannWenn Sie das Abfrageset trotzdem abrufen möchten, ist es etwas besser zu verwenden
len()
, da dies keine zusätzliche Datenbankabfrage verursachtcount()
dies wäre:Anzahl:
2. Fall rückgängig gemacht (wenn der Abfragesatz bereits abgerufen wurde):
Alles wird klar, wenn Sie einen Blick "unter die Haube" werfen:
Gute Referenzen in Django-Dokumenten:
quelle
QuerySet
kontextbezogene Veröffentlichung der Implementierung.Ich denke, die Verwendung
len(qs)
ist hier sinnvoller, da Sie die Ergebnisse durchlaufen müssen.qs.count()
ist eine bessere Option, wenn alles, was Sie tun möchten, die Anzahl druckt und nicht über die Ergebnisse iteriert.len(qs)
wird die Datenbank mit treffen,select * from table
während die Datenbank mitqs.count()
treffen wirdselect count(*) from table
.Außerdem
qs.count()
wird return integer angegeben, und Sie können nicht darüber iterierenquelle
Für Personen, die Testmessungen bevorzugen (Postresql):
Wenn wir ein einfaches Personenmodell und 1000 Instanzen davon haben:
Im Durchschnitt gibt es:
Wie können Sie also
count()
fast zweimal schneller sehen alslen()
in diesem speziellen Testfall?quelle
Zusammenfassen, was andere bereits beantwortet haben:
len()
ruft alle Datensätze ab und iteriert darüber.count()
führt eine SQL COUNT-Operation aus (viel schneller bei großen Abfragesätzen).Es ist auch richtig, dass, wenn nach dieser Operation der gesamte Abfragesatz iteriert wird, die Verwendung insgesamt etwas effizienter sein könnte
len()
.jedoch
In einigen Fällen, beispielsweise bei Speicherbeschränkungen, kann es zweckmäßig sein (wenn möglich), die ausgeführte Operation auf die Datensätze aufzuteilen. Dies kann durch Django-Paginierung erreicht werden .
Dann
count()
wäre die Verwendung die Wahl, und Sie könnten vermeiden, den gesamten Abfragesatz auf einmal abrufen zu müssen.quelle