Creazione di un elenco vuoto in Python


243

Qual è il modo migliore per creare un nuovo elenco vuoto in Python?

l = [] 

o

l = list()

Lo sto chiedendo per due motivi:

  1. Ragioni tecniche, su quale è più veloce. (la creazione di una classe provoca sovraccarico?)
  2. Leggibilità del codice - quale è la convenzione standard.

4
"Più veloce"? Perché non hai corso il tempo?
S.Lott

Risposte:


335

Ecco come testare quale codice è più veloce:

% 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

Tuttavia, in pratica, questa inizializzazione è molto probabilmente una parte estremamente piccola del programma, quindi preoccuparsi di questo è probabilmente sbagliato.

La leggibilità è molto soggettiva. Preferisco [], ma alcune persone molto competenti, come Alex Martelli, preferiscono list()perché è pronunciabile .


12
Caspita, grazie per la profilazione. Ho sempre desiderato sapere come è stato fatto.
user225312

Perché list('')dare []invece di ['']?
Chris_Rands,

Questo perché la lista delle funzioni di tipi iterabili non è stata inserita in più di 1 argomento. (Cerca di scrivere list('abcd')e capisci tutto)
Ivan Lavrenov,

133

list()è intrinsecamente più lento di [], perché

  1. c'è la ricerca di simboli (non c'è modo per Python di sapere in anticipo se non hai semplicemente ridefinito l'elenco per essere qualcos'altro!),

  2. c'è invocazione di funzioni,

  3. quindi deve verificare se è stato passato un argomento iterabile (in modo che possa creare un elenco con elementi da esso) ps. nessuno nel nostro caso ma c'è un controllo "if"

Nella maggior parte dei casi, tuttavia, la differenza di velocità non farà alcuna differenza pratica.


38
+1: è bello capire perché list()è più lento di []!
Eric O Lebigot,

2
Nel caso in list()cui deve solo verificare se c'è stato qualche argomento ... "controlla se iterabile" e "crea una lista con elementi" semplicemente non succede; si applicano solo se c'è un arg. È anche possibile che il codice C per []chiama lo stesso codice C di list(). In ogni caso il tempo impiegato in (c) sarebbe ridotto rispetto a (a) + (b).
John Machin,

1
@ John Machin - scusami per la confusione, quello che volevo dire in (c) era che avrebbe dovuto verificare se c'erano degli argomenti, sì. il resto riguardava cosa succederebbe se ci fossero discussioni, che nel nostro caso non ce ne sono
Nas Banov

16

Io uso [].

  1. È più veloce perché la notazione dell'elenco è un corto circuito.
  2. La creazione di un elenco con elementi dovrebbe essere simile alla creazione di un elenco senza, perché dovrebbe esserci una differenza?

3

Non lo so davvero, ma per esperienza mi sembra che jpcgt abbia ragione. Esempio seguente: se utilizzo il seguente codice

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

nell'interprete, quindi chiamare t mi dà solo "t" senza alcun elenco e se aggiungo qualcos'altro, ad es

t = t.append(2)

Ottengo l'errore "L'oggetto 'NoneType' non ha alcun attributo 'append'". Se, tuttavia, creo l'elenco di

t = list() # explicit instantiation

allora funziona benissimo.


15
È perché si t.append(1)modifica tsul posto, non restituisce altro ma Nonee lo si sta assegnando Nonea t. Quindi si triferisce ora Noneinvece che all'elenco. Il tuo errore qui è stato scrivere t=t.append(1)invece che solo t.append(1). Noterai lo stesso comportamento con list(), quindi non c'è differenza qui.
Darkonaut

1

Solo per evidenziare la risposta di @Darkonaut perché penso che dovrebbe essere più visibile.

new_list = []o new_list = list()vanno entrambi bene (ignorando le prestazioni), ma append()ritornano None, di conseguenza non puoi farlo new_list = new_list.append(something.

Sono molto perplesso da una simile decisione di ritorno. Che schifo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.