A maneira mais rápida de converter um iterador em uma lista

185

Tendo um iteratorobjeto, existe algo mais rápido, melhor ou mais correto do que uma compreensão de lista para obter uma lista dos objetos retornados pelo iterador?

user_list = [user for user in user_iterator]
systempuntoout
fonte
1
Antes de otimizar isso, verifique se você fez alguns perfis para provar que esse é realmente o gargalo.
S.Lott
1
@ S.Lott. Normalmente, eu concordo com essa atitude, mas, nesse caso, ela deve ser otimizada estilisticamente, o que, como costuma ser o caso do Python, também a otimiza para velocidade.
aaronasterling
3
O OP não disse nada sobre ter um gargalo. É uma pergunta geral perfeitamente perfeita, com uma resposta simples, não precisa depender de um aplicativo específico que possa ser executado através de um criador de perfil.
Ken Williams
4
A maneira mais compacta é [*iterator].
Challenger5

Respostas:

336
list(your_iterator)
mikerobi
fonte
5
Na verdade, quase sempre um pouco mais rápido. Além disso, muito mais óbvio.
Thomas Wouters
8
@systempuntoout É executado inteiramente em C. A compreensão da lista está em python. Claro que corre mais rápido.
aaronasterling 24/09/10
3
Eu ainda odeio totalmente que não há melhor maneira em python. É tedioso ter que editar os dois lados de uma expressão apenas para poder cortá-la ou indexá-la. (muito comum em python3, se é uma expressão pura como zip, ou um mapa com uma função pura)
Jo Então,
Hmm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `e list(ax._get_lines.prop_cycler)resulta em um loop infinito. Existe uma maneira elegante de lidar com isso?
Jens Munk #
5
No meu teste rápido, [*your_iterator]parecia ser duas vezes mais rápido que list(your_iterator). Isso geralmente é verdade ou foi apenas uma ocasião específica? (I utilizado um mapcomo iteração.)
Neinstein
11

desde o python 3.5, você pode usar o *operador de descompactação iterável:

user_list = [*your_iterator]

mas a maneira pitônica de fazer isso é:

user_list  = list(your_iterator)
kederrac
fonte