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]

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)

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.