Найшвидший спосіб перетворити ітератор до списку


185

Маючи iteratorоб’єкт, чи є щось швидше, краще чи правильніше, ніж розуміння списку, щоб отримати список об'єктів, повернутих ітератором?

user_list = [user for user in user_iterator]

1
Перш ніж оптимізувати це, переконайтеся, що ви зробили кілька профілів, щоб довести, що це насправді вузьке місце.
С.Лотт

1
@ S.Lott. Я зазвичай погоджуюся з таким ставленням, але в цьому випадку його дуже слід стилістично оптимізувати, що, як це часто трапляється з Python, також оптимізує його для швидкості.
aaronasterling

3
ОП нічого не сказала про наявність вузького місця. Це ідеально загальне загальне запитання з простою відповіддю, не потрібно залежати від конкретної програми, яку можна запустити через профайлер.
Кен Вільямс

4
Найбільш компактний спосіб [*iterator].
Challenger5

Відповіді:


336
list(your_iterator)

5
Насправді, майже завжди зовсім трохи швидше. Також набагато очевидніше.
Thomas Wouters

8
@systempuntoout Він працює повністю в C. Зрозуміння списку знаходиться в python. Звичайно, вона бігає швидше.
aaronasterling

3
Я все ще ненавиджу, що немає кращого способу в python. Досить нудно редагувати обидві сторони виразу, щоб мати змогу нарізати або індексувати його. (дуже часто в python3, якщо це чистий вираз, як zip, або карта з чистою функцією)
Jo So

Хм. import matplotlib.pyplot as plt' followed by ax = plt.gca () `і list(ax._get_lines.prop_cycler)призводить до нескінченного циклу. Чи є елегантний спосіб впоратися з цим?
Jens Munk

5
У моєму швидкому тестуванні [*your_iterator]виявилося приблизно вдвічі швидше list(your_iterator). Це взагалі правда, чи це був лише конкретний випадок? (Я використовував mapітератор.)
Нейнштейн

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.