Der schnellste Weg, einen Iterator in eine Liste zu konvertieren

183

Gibt es bei einem iteratorObjekt etwas Schnelleres, Besseres oder Richtigeres als ein Listenverständnis, um eine Liste der vom Iterator zurückgegebenen Objekte zu erhalten?

user_list = [user for user in user_iterator]
systempuntoout
quelle
1
Vergewissern Sie sich vor der Optimierung, dass Sie einige Profile erstellt haben, um zu beweisen, dass dies wirklich der Engpass ist.
S.Lott
1
@ S.Lott. Normalerweise stimme ich dieser Einstellung zu, aber in diesem Fall sollte sie sehr stilistisch optimiert werden, was, wie so oft bei Python, auch die Geschwindigkeit optimiert.
Aaronasterling
3
Das OP sagte nichts über einen Engpass. Es ist eine sehr gute allgemeine Frage mit einer einfachen Antwort. Sie muss nicht von einer bestimmten Anwendung abhängen, die über einen Profiler ausgeführt werden kann.
Ken Williams
4
Der kompakteste Weg ist [*iterator].
Challenger5

Antworten:

334
list(your_iterator)
mikerobi
quelle
5
Eigentlich fast immer ziemlich viel schneller. Auch viel offensichtlicher.
Thomas Wouters
8
@systempuntoout Es läuft vollständig in C. Das Listenverständnis ist in Python. Natürlich läuft es schneller.
Aaronasterling
3
Ich hasse es immer noch total, dass es in Python keinen besseren Weg gibt. Es ist mühsam, beide Seiten eines Ausdrucks bearbeiten zu müssen, um ihn in Scheiben schneiden oder indizieren zu können. (sehr häufig in Python3, wenn es sich um einen reinen Ausdruck wie zip oder eine Karte mit einer reinen Funktion handelt)
Jo So
Hmm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `und list(ax._get_lines.prop_cycler)führt zu einer Endlosschleife. Gibt es eine elegante Möglichkeit, damit umzugehen?
Jens Munk
5
In meinen schnellen Tests [*your_iterator]schien es ungefähr doppelt so schnell zu sein wie list(your_iterator). Ist das allgemein wahr oder war es nur ein bestimmter Anlass? (Ich habe einen mapals Iterator verwendet.)
Neinstein
10

Seit Python 3.5 können Sie den *iterierbaren Entpackungsoperator verwenden:

user_list = [*your_iterator]

aber der pythonische Weg , dies zu tun, ist:

user_list  = list(your_iterator)
Kederrac
quelle