Wann ist es besser, Zip statt izip zu benutzen?

Wann ist es besser, zip anstelle von itertools.izip zu benutzen?

4 Solutions collect form web for “Wann ist es besser, Zip statt izip zu benutzen?”

Wenn Sie wissen, dass Sie die vollständige Liste der konstruierten Gegenstände wünschen (z. B. für die Übergabe an eine Funktion, die diese Liste an Ort und Stelle ändern würde). Oder wenn du die Argumente erzwingen willst, die du an zip() , um an diesem Punkt vollständig ausgewertet zu werden.

zip berechnet alle Liste auf einmal, izip berechnet die Elemente nur, wenn angefordert.

Ein wichtiger Unterschied ist, dass 'zip' eine aktuelle Liste zurückgibt, 'izip' gibt ein 'izip-Objekt' zurück, das keine Liste ist und keine lordspezifischen Features (wie zB Indizierung) unterstützt:

 >>> l1 = [1, 2, 3, 4, 5, 6] >>> l2 = [2, 3, 4, 5, 6, 7] >>> z = zip(l1, l2) >>> iz = izip(l1, l2) >>> isinstance(zip(l1, l2), list) True >>> isinstance(izip(l1, l2), list) False >>> z[::2] #Get odd places [(1, 2), (3, 4), (5, 6)] >>> iz[::2] #Same with izip Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'itertools.izip' object is unsubscriptable 

Also, wenn du eine Liste brauchst (ein nicht ein listähnliches Objekt), benutze einfach 'zip'.

Abgesehen davon kann 'izip' nützlich sein, um Speicher oder Zyklen zu speichern.

ZB kann der folgende Code nach wenigen Zyklen beenden, also gibt es keine Notwendigkeit, alle Elemente der kombinierten Liste zu berechnen:

 lst_a = ... #list with very large number of items lst_b = ... #list with very large number of items #At each cycle, the next couple is provided for a, b in izip(lst_a, lst_b): if a == b: break print a 

Mit zip hätte alle (a, b) Paare vor dem Betreten des Zyklus berechnet.

Wenn lst_a und lst_b sehr groß sind (zB Millionen von Datensätzen), wird zip(a, b) eine dritte Liste mit doppeltem Raum aufbauen.

Aber wenn Sie kleine Listen haben, vielleicht ist zip schneller.

In 2.x, wenn du eine Liste anstelle eines Iterators benötigst.

Die itertools-Bibliothek bietet "Iteratoren" für gemeinsame Python-Funktionen. Von den itertools docs, "Like zip () außer dass es einen Iterator anstelle einer Liste zurückgibt." Das I in izip () bedeutet "Iterator".

Python-Iteratoren sind eine "faul geladene" Sequenz, die Speicher über eine regelmäßige In-Memory-Liste speichert. Also, du würdest itertools.izip (a, b) verwenden, wenn die beiden Eingänge a, b zu groß sind, um auf einmal im Speicher zu bleiben.

Schauen Sie sich die Python-Konzepte im Zusammenhang mit effizienter sequentieller Verarbeitung an:

 "generators" & "yield" "iterators" "lazy loading" 
  • Lesen von seriellen Daten in Echtzeit in Python
  • Installieren von Pythonpaketen mit mehreren Versionen auf OSX
  • Python-Demo-Web-Projekte auf einem Tornado-Server?
  • Starten Sie den Prozess auf dem anderen Desktop, Python, Windows
  • Wie verwende ich Unterprozesse, um Python zu zwingen, Speicher freizugeben?
  • Python - Definieren einer Integer-Variablen über mehrere Zeilen
  • Zufällige Boolesche nach Prozentsatz
  • Wie mache ich Python 3.5 meine Standardversion auf MacOS?
  • Pip oder pip3, um Pakete für Python 3 zu installieren?
  • ImportError: Kein Modul namens Django
  • Django komplett deinstallieren
  • Python ist die beste Programmiersprache der Welt.