Créer une liste vide en Python


243

Quelle est la meilleure façon de créer une nouvelle liste vide en Python?

l = [] 

ou

l = list()

Je pose cette question pour deux raisons:

  1. Raisons techniques, quant à laquelle est plus rapide. (la création d'une classe entraîne des frais généraux?)
  2. Lisibilité du code - lequel est la convention standard.

4
"plus rapide"? Pourquoi n'avez-vous pas exécuté timeit?
S.Lott

Réponses:


335

Voici comment tester le morceau de code le plus rapide:

% 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

Cependant, dans la pratique, cette initialisation est très probablement une très petite partie de votre programme, donc vous inquiéter à ce sujet est probablement erroné.

La lisibilité est très subjective. Je préfère [], mais certaines personnes très bien informées, comme Alex Martelli, préfèrent list()parce que c'est prononçable .


12
Wow, merci pour le profilage. J'avais toujours voulu savoir comment c'était fait.
user225312

Pourquoi list('')donne []au lieu de ['']?
Chris_Rands

C'est parce que cette liste de fonctions func à partir de types itérables, vous ne pouvez pas insérer dans plus d'un argument. (Essayez de taper list('abcd')et vous comprenez tout)
Ivan Lavrenov

133

list()est intrinsèquement plus lent que [], car

  1. il y a une recherche de symboles (aucun moyen pour python de savoir à l'avance si vous n'avez pas simplement redéfini la liste pour être autre chose!),

  2. il y a invocation de fonction,

  3. ensuite, il doit vérifier si un argument itérable a été passé (pour pouvoir créer une liste avec des éléments) ps. aucun dans notre cas mais il y a une vérification "si"

Dans la plupart des cas, la différence de vitesse ne fera cependant aucune différence pratique.


38
+1: Cela fait du bien de comprendre pourquoi list()est plus lent que []!
Eric O Lebigot

2
Dans ce cas, list()il suffit de vérifier s'il y a eu un argument du tout ... "vérifier s'il est itérable" et "créer une liste avec des éléments" ne se produisent tout simplement pas; ils ne s'appliquent que s'il y a un argument. Il est même possible que le code C pour les []appels le même code C que list(). Dans tous les cas, le temps impliqué en (c) serait minime par rapport à (a) + (b).
John Machin

1
@John Machin - désolé pour la confusion, ce que je voulais dire en (c) était qu'il devra vérifier s'il y avait un argument, oui. le reste était de savoir ce qui se passerait s'il y avait une dispute, qui dans notre cas il n'y en a pas
Nas Banov

16

J'utilise [].

  1. C'est plus rapide car la notation de liste est un court-circuit.
  2. La création d'une liste avec des éléments devrait ressembler à la création d'une liste sans, pourquoi devrait-il y avoir une différence?

3

Je ne le sais pas vraiment, mais il me semble, par expérience, que jpcgt a réellement raison. Exemple suivant: si j'utilise le code suivant

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

dans l'interpréteur, puis appeler t me donne juste "t" sans aucune liste, et si j'ajoute autre chose, par exemple

t = t.append(2)

J'obtiens l'erreur "L'objet 'NoneType' n'a pas d'attribut 'append'". Si, cependant, je crée la liste en

t = list() # explicit instantiation

alors ça marche bien.


15
C'est parce que t.append(1)modifie ten place, il ne retourne rien mais Noneet vous l'assignez Noneà t. Se tréfère donc maintenant à la Noneplace de la liste. Votre erreur ici était d'écrire t=t.append(1)au lieu de simplement t.append(1). Vous remarquerez le même comportement avec list(), donc il n'y a pas de différence ici.
Darkonaut

1

Juste pour mettre en évidence la réponse de @Darkonaut parce que je pense qu'elle devrait être plus visible.

new_list = []ou new_list = list()sont à la fois très bien (ignorant les performances), mais append()revient None, comme résultat, vous ne pouvez pas le faire new_list = new_list.append(something.

Je suis très perplexe devant une telle décision de type retour. Beurk.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.