¿Hay alguna diferencia de rendimiento entre tuplas y listas cuando se trata de instanciación y recuperación de elementos?
python
performance
list
tuples
python-internals
Solo lectura
fuente
fuente
Respuestas:
El
dis
módulo desmonta el código de bytes para una función y es útil para ver la diferencia entre tuplas y listas.En este caso, puede ver que acceder a un elemento genera un código idéntico, pero que asignar una tupla es mucho más rápido que asignar una lista.
fuente
ListLike
con algo__getitem__
que haga algo terriblemente lento, luego desarmax = ListLike((1, 2, 3, 4, 5)); y = x[2]
. El código de bytes será más parecido al ejemplo de tupla anterior que al ejemplo de la lista, pero ¿realmente cree que eso significa que el rendimiento será similar?En general, puede esperar que las tuplas sean un poco más rápidas. Sin embargo, definitivamente debe probar su caso específico (si la diferencia puede afectar el rendimiento de su programa, recuerde que "la optimización prematura es la raíz de todo mal").
Python hace esto muy fácil: timeit es su amigo.
y...
Entonces, en este caso, la instanciación es casi un orden de magnitud más rápido para la tupla, ¡pero el acceso a los elementos es en realidad algo más rápido para la lista! Entonces, si está creando algunas tuplas y accediendo a ellas muchas veces, en realidad puede ser más rápido usar listas.
Por supuesto, si desea cambiar un elemento, la lista definitivamente será más rápida ya que necesitaría crear una tupla completamente nueva para cambiar un elemento (ya que las tuplas son inmutables).
fuente
python -m timeit "x=tuple(xrange(999999))"
vspython -m timeit "x=list(xrange(999999))"
. Como cabría esperar, se tarda un poco más en materializar una tupla que una lista.-s "SETUP_CODE"
se ejecuta antes del código temporizado real.Resumen
Las tuplas tienden a funcionar mejor que las listas en casi todas las categorías:
1) Las tuplas pueden doblarse constantemente .
2) Las tuplas pueden reutilizarse en lugar de copiarse.
3) Las tuplas son compactas y no se asignan en exceso.
4) Las tuplas hacen referencia directa a sus elementos.
Las tuplas pueden doblarse constantemente
Las tuplas de constantes pueden calcularse previamente mediante el optimizador de mirilla de Python o el optimizador AST. Las listas, por otro lado, se acumulan desde cero:
Las tuplas no necesitan ser copiadas
La ejecución
tuple(some_tuple)
vuelve inmediatamente a sí misma. Como las tuplas son inmutables, no es necesario copiarlas:Por el contrario,
list(some_list)
requiere que todos los datos se copien en una nueva lista:Las tuplas no se sobreasignan
Dado que el tamaño de una tupla es fijo, se puede almacenar de manera más compacta que las listas que deben sobreasignarse para que las operaciones append () sean eficientes.
Esto le da a las tuplas una buena ventaja de espacio:
Aquí está el comentario de Objects / listobject.c que explica qué están haciendo las listas:
Las tuplas se refieren directamente a sus elementos.
Las referencias a los objetos se incorporan directamente en un objeto de tupla. Por el contrario, las listas tienen una capa adicional de indirección a una matriz externa de punteros.
Esto le da a las tuplas una pequeña ventaja de velocidad para búsquedas indexadas y desempaque:
Aquí es cómo la tupla
(10, 20)
se almacena:Aquí es cómo la lista
[10, 20]
se almacena:Tenga en cuenta que el objeto tupla incorpora los dos punteros de datos directamente, mientras que el objeto de la lista tiene una capa adicional de indirección a una matriz externa que contiene los dos punteros de datos.
fuente
Internally, tuples are stored a little more efficiently than lists, and also tuples can be accessed slightly faster.
¿Cómo podrías explicar los resultados de la respuesta de dF.tuple(some_tuple)
solo se devuelvesome_tuple
sisome_tuple
es hashable, cuando su contenido es recursivamente inmutable y hashable. De lo contrario,tuple(some_tuple)
devuelve una nueva tupla. Por ejemplo, cuandosome_tuple
contiene elementos mutables.Las tuplas, siendo inmutables, son más eficientes en memoria; enumera, por eficiencia, sobreasignar memoria para permitir anexos sin
realloc
s constante . Entonces, si desea iterar a través de una secuencia constante de valores en su código (por ejemplofor direction in 'up', 'right', 'down', 'left':
), se prefieren las tuplas, ya que dichas tuplas se calculan previamente en tiempo de compilación.Las velocidades de acceso deben ser las mismas (ambas se almacenan como matrices contiguas en la memoria).
Pero,
alist.append(item)
se prefiere muchoatuple+= (item,)
cuando se trata con datos mutables. Recuerde, las tuplas están destinadas a ser tratadas como registros sin nombres de campo.fuente
También debe considerar el
array
módulo en la biblioteca estándar si todos los elementos de su lista o tupla son del mismo tipo C. Tomará menos memoria y puede ser más rápido.fuente
Aquí hay otro pequeño punto de referencia, solo por el bien ...
Vamos a promediar estos:
Puedes llamarlo casi inconcluso.
Pero claro, las tuplas se tomaron
101.239%
el tiempo o1.239%
tiempo extra para hacer el trabajo en comparación con las listas.fuente
Las tuplas deberían ser un poco más eficientes y, por eso, más rápidas que las listas porque son inmutables.
fuente
La razón principal para que Tuple sea muy eficiente en la lectura es porque es inmutable.
¿Por qué los objetos inmutables son fáciles de leer?
La razón es que las tuplas se pueden almacenar en la memoria caché, a diferencia de las listas. El programa siempre lee la ubicación de la memoria de las listas, ya que es mutable (puede cambiar en cualquier momento).
fuente