Najszybszy sposób na przekonwertowanie iteratora na listę

185

Posiadając iteratorobiekt, czy istnieje coś szybszego, lepszego lub bardziej poprawnego niż zrozumienie listy, aby uzyskać listę obiektów zwróconych przez iterator?

user_list = [user for user in user_iterator]
systempuntoout
źródło
1
Przed zoptymalizowaniem tego upewnij się, że wykonałeś profilowanie, aby udowodnić, że to naprawdę wąskie gardło.
S.Lott,
1
@ S.Lott. Zwykle zgadzam się z tym podejściem, ale w tym przypadku należy go bardzo zoptymalizować stylistycznie, co - jak to często bywa w przypadku Pythona - również zoptymalizuje je pod kątem szybkości.
aaronasterling
3
OP nie wspomniał o wąskim gardle. Jest to doskonale ogólne pytanie z prostą odpowiedzią, nie musi zależeć od konkretnej aplikacji, którą można uruchomić za pomocą profilera.
Ken Williams
4
Najbardziej kompaktowy sposób to [*iterator].
Challenger5

Odpowiedzi:

336
list(your_iterator)
mikerobi
źródło
5
Właściwie prawie zawsze nieco szybciej. Również o wiele bardziej oczywiste.
Thomas Wouters
8
@systempuntoout Działa całkowicie w C. Zrozumienie listy jest w pythonie. Oczywiście działa szybciej.
aaronasterling
3
Nadal całkowicie nienawidzę tego, że nie ma lepszego sposobu na Python. Edycja obu stron wyrażenia jest żmudna, aby móc ją pokroić lub zindeksować. (bardzo powszechne w python3, jeśli jest to czyste wyrażenie, takie jak zip lub mapa z czystą funkcją)
Jo So
Hmm import matplotlib.pyplot as plt' followed by ax = plt.gca () `i list(ax._get_lines.prop_cycler)powoduje nieskończoną pętlę. Czy istnieje elegancki sposób na poradzenie sobie z tym?
Jens Munk
5
W moich szybkich testach [*your_iterator]wydawało się około dwa razy szybsze niż list(your_iterator). Czy to na ogół prawda, czy była to tylko konkretna okazja? (Użyłem mapiteratora.)
Neinstein,
11

od Pythona 3.5 możesz używać *iterowalnego operatora rozpakowywania:

user_list = [*your_iterator]

ale pytonicznym sposobem na to jest:

user_list  = list(your_iterator)
kederrac
źródło