Was ist mit dem Zählen der Nullen?
Der grundlegende Instinkt der meisten ist es, ein list comprehension zu schreiben:
max([len(i) for i in s.split('1')])Das wird funktionieren. Aber zuerst teilt man die Zeichenkette (erzeugt eine Liste im Speicher) und durchläuft sie dann in einer Schleife, um eine weitere Liste von ganzen Zahlen zu erstellen, die man an
max() übergibt. Doppelter Speicherverbrauch ohne Grund.Man kann aber auch einen Generator verwenden:
max((len(chunk) for chunk in s.split('1')))Speichertechnisch ist das schön – die Zwischenliste der Längen wird nicht erstellt. Aber geschwindigkeitsmäßig sind Generatorausdrücke innerhalb eingebauter Funktionen in Python langsamer aufgrund des Overheads für Iteration und Funktionsaufrufe auf Bytecode-Ebene.
Und so ist es noch besser:
max(map(len, s.split('1')))Wir vermeiden die Python-Schleife.
map ist in C implementiert, lazy, arbeitet schnell und frisst keinen Speicher. Die meisten beruhigen sich damit zufrieden.Aber... das ist auch nicht optimal. Fragen Sie sich: Warum berechnen wir überhaupt die Längen aller Teile, bevor wir das Maximum finden?
Zeichenketten in Python werden lexikografisch verglichen. Zeichen für Zeichen. Folglich ist die Zeichenkette
"000" immer größer als "00". Wir müssen überhaupt nicht die Längen der Teilzeichenketten berechnen, um sie zu vergleichen.So muss es sein!
len(max(s.split('1')))Warum ist das die beste Lösung? 🤔
1. Der Aufruf
s.split('1') gibt sofort eine Liste von Zeichenketten zurück.2.
max() verschlingt diese Liste und vergleicht auf C-Ebene die Zeichenketten selbst. Kein map, keine Aufrufe von len für jedes Element, keine Funktionsaufrufe in einer Schleife.3. Wir rufen
len() genau einmal auf – von der gewinnenden Zeichenkette.Weniger Bewegungen des Interpreters = schnellerer Code.
#алгособес
Kommentare
0Noch keine Kommentare.
Melde dich an, um mitzudiskutieren.