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:
- Raisons techniques, quant à laquelle est plus rapide. (la création d'une classe entraîne des frais généraux?)
- Lisibilité du code - lequel est la convention standard.
python
performance
list
coding-style
timeit
user225312
la source
la source
Réponses:
Voici comment tester le morceau de code le plus rapide:
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èrentlist()
parce que c'est prononçable .la source
list('')
donne[]
au lieu de['']
?list('abcd')
et vous comprenez tout)list()
est intrinsèquement plus lent que[]
, caril 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!),
il y a invocation de fonction,
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.
la source
list()
est plus lent que[]
!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 quelist()
. Dans tous les cas, le temps impliqué en (c) serait minime par rapport à (a) + (b).J'utilise
[]
.la source
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
dans l'interpréteur, puis appeler t me donne juste "t" sans aucune liste, et si j'ajoute autre chose, par exemple
J'obtiens l'erreur "L'objet 'NoneType' n'a pas d'attribut 'append'". Si, cependant, je crée la liste en
alors ça marche bien.
la source
t.append(1)
modifiet
en place, il ne retourne rien maisNone
et vous l'assignezNone
àt
. Set
réfère donc maintenant à laNone
place de la liste. Votre erreur ici était d'écriret=t.append(1)
au lieu de simplementt.append(1)
. Vous remarquerez le même comportement aveclist()
, donc il n'y a pas de différence ici.Juste pour mettre en évidence la réponse de @Darkonaut parce que je pense qu'elle devrait être plus visible.
new_list = []
ounew_list = list()
sont à la fois très bien (ignorant les performances), maisappend()
revientNone
, comme résultat, vous ne pouvez pas le fairenew_list = new_list.append(something
.Je suis très perplexe devant une telle décision de type retour. Beurk.
la source