Самый быстрый способ конвертировать итератор в список


185

Имея iteratorобъект, есть ли что-то быстрее, лучше или правильнее, чем понимание списка, чтобы получить список объектов, возвращаемых итератором?

user_list = [user for user in user_iterator]

1
Прежде чем оптимизировать это, убедитесь, что вы выполнили профилирование, чтобы доказать, что это действительно узкое место.
С.Лотт

1
@ С. Лотт. Я обычно согласен с таким подходом, но в этом случае он должен быть стилистически оптимизирован, что, как это часто бывает в Python, оптимизирует его и по скорости.
Ааронастерлинг

3
ОП ничего не сказал о наличии узкого места. Это очень хороший общий вопрос с простым ответом, он не должен зависеть от конкретного приложения, которое можно запустить через профилировщик.
Кен Уильямс

4
Самый компактный способ есть [*iterator].
Challenger5

Ответы:


336
list(your_iterator)

5
На самом деле, почти всегда немного быстрее. Также гораздо очевиднее.
Томас Воутерс

8
@systempuntoout Он полностью работает на C. Понимание списка написано на python. Конечно, это работает быстрее.
Ааронастерлинг

3
Я до сих пор полностью ненавижу, что в питоне нет лучшего способа. Утомительно редактировать обе стороны выражения только для того, чтобы иметь возможность разрезать или индексировать его. (очень часто встречается в python3, если это чистое выражение типа zip или map с чистой функцией)
Jo So

Хм. import matplotlib.pyplot as plt' followed by ax = plt.gca () `и list(ax._get_lines.prop_cycler)приводит к бесконечному циклу. Есть ли элегантный способ справиться с этим?
Йенс Мунк,

5
В моем быстром тестировании [*your_iterator]оказалось примерно в два раза быстрее list(your_iterator). Это вообще правда, или это был просто особый случай? (Я использовал в mapкачестве итератора.)
Нейнштейн

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.