Wann ist es besser zu verwenden zip
als itertools.izip
?
python
python-2.7
itertools
Neil G.
quelle
quelle
zip
, zu offensichtlich und dennoch erwähnenswert, ist dieizip
Rückgabe einer,iterator
die nur einmal durchlaufen werden kann. dh inii = izip(a,b) ; f(ii) ; g(ii)
, hier wird eine leere Liste[]
übergebeng
.zip
Funktion von Python 3 ist die von Python 2izip
. Im Allgemeinen hat Python 3 die meisten Funktionen geändert, um Iteratoren wie Bereich, Filter,Antworten:
Wenn Sie wissen, dass die vollständige Liste der Elemente erstellt werden soll (z. B. zum Übergeben an eine Funktion, die diese Liste an Ort und Stelle ändert). Oder wenn Sie erzwingen möchten, dass die Argumente, an die Sie übergeben,
zip()
an diesem bestimmten Punkt vollständig ausgewertet werden.quelle
izip
Verwendet das nur wieder,tuple
wenn dastuple
vor Beginn der nächsten Iteration freigegeben wurde, sodass Sie nichts gewinnen. Das heißt, jeder Verlust ist auch trivial, daher stimme ich zu, dass es wenig Grund gibt, nichtizip
ausschließlich zu verwenden ,list
wenn Sie einen benötigenlist
. Sie können dies tatsächlich tun , um die „richtige“ Art und Weise durch Zugabefrom future_builtins import zip
zu Py2 - Code, die Ebene machtzip
inizip
(für PY3 Übergang Vorbereitung).zip
berechnet die gesamte Liste auf einmal,izip
berechnet die Elemente nur auf Anfrage.Ein wichtiger Unterschied besteht darin, dass 'zip' eine tatsächliche Liste zurückgibt, 'izip' ein 'izip-Objekt' zurückgibt, das keine Liste ist und keine listenspezifischen Funktionen (wie die 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
Wenn Sie also eine Liste benötigen (ein nicht listähnliches Objekt), verwenden Sie einfach 'zip'.
Abgesehen davon kann 'izip' nützlich sein, um Speicher oder Zyklen zu sparen.
Beispielsweise kann der folgende Code nach wenigen Zyklen beendet werden, sodass nicht alle Elemente der kombinierten Liste berechnet werden müssen:
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
using
zip
hätte alle(a, b)
Paare vor dem Eintritt in den Zyklus berechnet .Wenn darüber hinaus
lst_a
undlst_b
sind sehr groß (zB Millionen von Datensätzen),zip(a, b)
bauen eine dritte Liste mit Doppelraum.Aber wenn Sie kleine Listen haben, ist vielleicht
zip
schneller.quelle
In 2.x, wenn Sie eine Liste anstelle eines Iterators benötigen .
quelle
itertools.izip()
wenn die Gewinne rein statistisch sind.lst = zip(lst_a, lst_b)
erlaubtlst[1]
oderlen(lst)
. Doch für dieilst = itertools.izip(lst_a, lst_n)
versuchen , werden Sie scheiternilst[1]
oderlen(ilst)
.Die itertools-Bibliothek bietet "Iteratoren" für allgemeine Python-Funktionen. In den itertools-Dokumenten heißt es: "Wie zip (), außer dass ein Iterator anstelle einer Liste zurückgegeben wird." Das I in izip () bedeutet "Iterator".
Python-Iteratoren sind eine "faul geladene" Sequenz, die Speicher über die reguläre In-Memory-Liste spart. Sie würden also itertools.izip (a, b) verwenden, wenn die beiden Eingänge a, b zu groß sind, um gleichzeitig im Speicher zu bleiben.
Schlagen Sie die Python-Konzepte für eine effiziente sequentielle Verarbeitung nach:
"generators" & "yield" "iterators" "lazy loading"
quelle