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]

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)

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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.