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

185

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

user_list = [user for user in user_iterator]
systempuntoout
источник
1
Прежде чем оптимизировать это, убедитесь, что вы выполнили профилирование, чтобы доказать, что это действительно узкое место.
С.Лотт
1
@ С. Лотт. Я обычно согласен с таким подходом, но в этом случае он должен быть стилистически оптимизирован, что, как это часто бывает в Python, оптимизирует его и по скорости.
Ааронастерлинг
3
ОП ничего не сказал о наличии узкого места. Это очень хороший общий вопрос с простым ответом, он не должен зависеть от конкретного приложения, которое можно запустить через профилировщик.
Кен Уильямс
4
Самый компактный способ есть [*iterator].
Challenger5

Ответы:

336
list(your_iterator)
mikerobi
источник
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качестве итератора.)
Нейнштейн
11

начиная с python 3.5 вы можете использовать *итеративный оператор распаковки:

user_list = [*your_iterator]

но питонский способ сделать это:

user_list  = list(your_iterator)
kederrac
источник