Crear una lista vacía en Python

243

¿Cuál es la mejor manera de crear una nueva lista vacía en Python?

l = [] 

o

l = list()

Estoy preguntando esto por dos razones:

  1. Razones técnicas, en cuanto a cuál es más rápido. (¿crear una clase causa sobrecarga?)
  2. Legibilidad de código: cuál es la convención estándar.
usuario225312
fuente
44
"Más rápido"? ¿Por qué no corriste timeit?
S.Lott

Respuestas:

335

Aquí es cómo puede probar qué código es más rápido:

% 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

Sin embargo, en la práctica, esta inicialización es probablemente una parte extremadamente pequeña de su programa, por lo que preocuparse por esto probablemente sea erróneo.

La legibilidad es muy subjetiva. Prefiero [], pero algunas personas muy conocedoras, como Alex Martelli, prefieren list()porque es pronunciable .

unutbu
fuente
12
Wow, gracias por el perfil. Siempre quise saber cómo se hizo.
user225312
¿Por qué list('')dar en []lugar de ['']?
Chris_Rands
Esto se debe a que esta lista de funciones de tipos iterables no se puede insertar en más de 1 argumento. (Intenta escribir list('abcd')y lo entenderás todo)
Ivan Lavrenov
133

list()es inherentemente más lento que [], porque

  1. hay una búsqueda de símbolos (¡no hay forma de que Python sepa de antemano si no solo redefinió la lista para que sea otra cosa!),

  2. hay invocación de funciones,

  3. entonces tiene que verificar si se pasó un argumento iterable (para que pueda crear una lista con elementos de él) ps. ninguno en nuestro caso pero hay un "si" marca

Sin embargo, en la mayoría de los casos, la diferencia de velocidad no hará ninguna diferencia práctica.

Nas Banov
fuente
38
+1: ¡Se siente bien entender por qué list()es más lento que []!
Eric O Lebigot
2
En el caso de list()que solo tenga que verificar si hubo algún argumento ... "verificar si es iterable" y "crear lista con elementos" simplemente no sucede; solo se aplican si hay un argumento. Es incluso posible que el código C para []las llamadas el mismo código C como list(). En cualquier caso, el tiempo involucrado en (c) sería pequeño en comparación con (a) + (b).
John Machin
1
@John Machin: perdón por la confusión, lo que quise decir en (c) fue que tendrá que verificar si hubo argumentos, sí. el resto fue sobre lo que sucedería si hubiera argumentos, que en nuestro caso no hay ninguno
Nas Banov
16

Yo uso [].

  1. Es más rápido porque la notación de la lista es un corto circuito.
  2. Crear una lista con elementos debería tener el mismo aspecto que crear una lista sin ellos, ¿por qué debería haber una diferencia?
Georg Schölly
fuente
3

Realmente no lo sé, pero me parece, por experiencia, que jpcgt tiene razón. Ejemplo siguiente: si uso el siguiente código

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

en el intérprete, llamar a t solo me da "t" sin ninguna lista, y si agrego algo más, p. ej.

t = t.append(2)

Me sale el error "El objeto 'NoneType' no tiene el atributo 'append'". Sin embargo, si creo la lista por

t = list() # explicit instantiation

entonces funciona bien.

Yinyue
fuente
15
Es porque t.append(1)modifica ten su lugar, no devuelve nada Noney está asignando este Nonea t. Entonces se trefiere ahora a en Nonelugar de a la lista. Tu error aquí fue escribir en t=t.append(1)lugar de solo t.append(1). Notarás el mismo comportamiento con list(), así que no hay diferencia aquí.
Darkonaut
1

Solo para resaltar la respuesta de @Darkonaut porque creo que debería ser más visible.

new_list = []o new_list = list()ambos están bien (ignorando el rendimiento), pero append()regresa None, como resultado, no puede hacerlo new_list = new_list.append(something.

Estoy muy perplejo por tal decisión de tipo de retorno. Yuck

oVo
fuente