Criando uma lista vazia no Python

243

Qual é a melhor maneira de criar uma nova lista vazia no Python?

l = [] 

ou

l = list()

Estou perguntando isso por dois motivos:

  1. Razões técnicas, quanto ao que é mais rápido. (criar uma classe causa sobrecarga?)
  2. Legibilidade do código - qual é a convenção padrão.
user225312
fonte
4
"Mais rápido"? Por que você não correu tempo?
precisa saber é o seguinte

Respostas:

335

Aqui está como você pode testar qual parte do código é mais rápida:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

No entanto, na prática, essa inicialização provavelmente é uma parte extremamente pequena do seu programa, portanto, se preocupar com isso provavelmente é errado.

A legibilidade é muito subjetiva. Eu prefiro [], mas algumas pessoas muito qualificadas, como Alex Martelli, preferem list()porque é pronunciável .

unutbu
fonte
12
Uau, obrigado pelo perfil. Eu sempre quis saber como foi feito.
user225312
Por que list('')dar em []vez de ['']?
Chris_Rands
Isso ocorre porque essa função faz lista de tipos iteráveis, você não pode inserir mais de um argumento. (Tente digitar list('abcd')e você entenderá tudo) #
4379 Ivan Lavrenov 17/10
133

list()é inerentemente mais lento que [], porque

  1. existe uma pesquisa de símbolo (não há como o python saber antecipadamente se você não redefiniu a lista como algo diferente!),

  2. há invocação de função,

  3. então ele deve verificar se houve um argumento iterável passado (para que ele possa criar uma lista com elementos dele) ps. nenhum no nosso caso, mas existe uma verificação "se"

Na maioria dos casos, a diferença de velocidade não fará nenhuma diferença prática.

Nas Banov
fonte
38
+1: É bom entender por que list()é mais lento que []!
Eric O Lebigot
2
No caso list(), basta verificar se houve algum argumento ... "verifique se iterável" e "criar lista com elementos" simplesmente não acontecem; eles se aplicam apenas se houver um argumento. É até possível que o código C para []chame o mesmo código C que list(). De qualquer forma, o tempo envolvido em (c) seria pequeno comparado com (a) + (b).
precisa
1
@ John Machin - desculpe pela confusão, o que eu quis dizer em (c) foi que ele precisará verificar se houve algum argumento, sim. o resto era sobre o que aconteceria se houvesse argumento, o que, no nosso caso, não existe nenhum
Nas Banov 04/04
16

Eu uso [].

  1. É mais rápido porque a notação da lista é um curto-circuito.
  2. Criar uma lista com itens deve ter a mesma aparência de criar uma lista sem, por que deveria haver uma diferença?
Georg Schölly
fonte
3

Eu realmente não sei, mas parece-me, por experiência, que jpcgt está realmente certo. Exemplo a seguir: Se eu usar o seguinte código

t = [] # implicit instantiation
t = t.append(1)

no intérprete, a chamada t me dá apenas "t" sem nenhuma lista e, se eu anexar outra coisa, por exemplo

t = t.append(2)

Recebo o erro "O objeto 'NoneType' não tem atributo 'anexar'". Se, no entanto, eu criar a lista por

t = list() # explicit instantiation

então funciona bem.

Yinyue
fonte
15
É porque as t.append(1)modificações são tefetuadas, não retornam nada, Nonee você está atribuindo isso Nonea t. Então, trefere-se agora a em Nonevez de à lista. Seu erro aqui foi escrever em t=t.append(1)vez de apenas t.append(1). Você notará o mesmo comportamento com list(), então não há diferença aqui.
Darkonaut
1

Apenas para destacar a resposta do @Darkonaut porque acho que deveria ser mais visível.

new_list = []ou new_list = list()ambos são bons (ignorando o desempenho), mas append()retornam None, como resultado, você não pode fazer new_list = new_list.append(something.

Estou muito intrigado com uma decisão desse tipo de retorno. Que nojo.

oVo
fonte