Betrachten Sie das Problem der Alphabete aus einer großen Zeichenfolge extrahieren.Fäden verbinden. Generator oder Listenverständnis?
Eine Möglichkeit ist, zu tun
''.join([c for c in hugestring if c.isalpha()])
Der Mechanismus ist klar: Die Liste Verständnis eine Liste von Zeichen erzeugt. Die Join-Methode weiß, wie viele Zeichen benötigt werden, um auf die Länge der Liste zuzugreifen.
Andere Art und Weise zu tun, ist
''.join(c for c in hugestring if c.isalpha())
Hier wird der Generator Verständnis führt zu einem Generator. Die Join-Methode weiß nicht, wie viele Zeichen sie verbinden wird, da der Generator kein len Attribut besitzt. Diese Art des Beitritts sollte also langsamer sein als die Listenverständnismethode.
Testen in Python zeigt jedoch, dass es nicht langsamer ist. Warum ist das so? Kann jemand erklären, wie Join an einem Generator funktioniert.
Um klar zu sein:
sum(j for j in range(100))
benötigt keine Kenntnisse von 100 zu haben, weil sie den Überblick über die kumulative Summe zu halten. Er kann auf das nächste Element zugreifen, indem er die nächste Methode für den Generator verwendet, und dann zur kumulativen Summe hinzufügen. Da Strings jedoch unveränderlich sind, würde das kumulative Verknüpfen von Strings in jeder Iteration eine neue Zeichenfolge erzeugen. Das würde also viel Zeit in Anspruch nehmen.
Also sollte der Unterschied in der Geschwindigkeit OP Hinweise rein umständlich sein, oder? –
@ Ev.Kounis: Der Fragesteller sagte, dass die beiden Versionen in der Geschwindigkeit ähnlich sind ("** nicht ** langsamer"), was sinnvoll ist, wenn sie sowohl die Zeit von 'join' als auch die Zeit des Listenverständnisses messen zusammen. Wenn Sie nur den 'Join' messen, wäre die Version des Generator-Ausdrucks langsamer, da der gesamte Generator in eine Liste geschrieben werden muss, bevor ein String-Join durchgeführt wird. Das dauert ungefähr so lange wie das Listenverständnis in der anderen Version. – Blckknght