Wenn ich len () auf einer sehr langen Liste immer wieder aufrufe, verschwende ich Zeit oder bleibt eine int-Zählung im Hintergrund?
Wenn ich len () auf einer sehr langen Liste immer wieder aufrufe, verschwende ich Zeit oder bleibt eine int-Zählung im Hintergrund?
Antworten:
Keine Sorge: Natürlich spart es die Zählung und ist daher len()auf Listen eine ziemlich billige Operation. Gleiches gilt übrigens für Strings, Wörterbücher und Sets!
Ein weiterer Weg, um herauszufinden, wie es gemacht wird, ist um es in der Google Code Search nachzuschlagen Schauen Sie sich die Quelle auf GitHub an , wenn Sie die Quelle nicht selbst herunterladen möchten.
static Py_ssize_t list_length(PyListObject *a)
{
return a->ob_size;
}
Schreiben Sie Ihr Programm so, dass es für Klarheit optimiert und leicht zu warten ist . Ist Ihr Programm mit einem Aufruf an klarer len(foo)? Dann mach das.
Sind Sie besorgt über die benötigte Zeit? Verwenden Sie das timeitModul in der Standardbibliothek , um die benötigte Zeit zu messen und festzustellen, ob sie in Ihrem Code von Bedeutung ist.
Sie werden, wie die meisten Leute, sehr wahrscheinlich falsch raten, welche Teile Ihres Programms am langsamsten sind. Vermeiden Sie die Versuchung zu raten und messen Sie sie stattdessen, um es herauszufinden.
Denken Sie daran, dass vorzeitige Optimierung nach Donald Knuths Worten die Wurzel allen Übels ist. Konzentrieren Sie sich nur auf die Geschwindigkeit des Codes, dessen Geschwindigkeit Sie gemessen haben , um festzustellen, ob der Nutzen die Kosten für eine Änderung der Funktionsweise wert ist.
Die Frage wurde beantwortet ( lenist O (1)), aber so können Sie es selbst überprüfen:
$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop
Ja, nicht wirklich langsamer.
Die Länge muss irgendwo gespeichert werden, damit Sie nicht jedes Mal die Anzahl der Elemente zählen.