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.
user225312
la source
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 .

unutbu
la source
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.

Nas Banov
la source
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?
Georg Schölly
la source
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.

Yinyue
la source
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.

oVo
la source