En Python, ¿qué estructura de datos es más eficiente / rápida? Suponiendo que el orden no es importante para mí y estaría buscando duplicados de todos modos, ¿es un Python más lento que una lista de Python?
python
list
performance
data-structures
set
Mantas Vidutis
fuente
fuente
Las listas son un poco más rápidas que los conjuntos cuando solo desea iterar sobre los valores.
Sin embargo, los conjuntos son significativamente más rápidos que las listas si desea verificar si un elemento está contenido en él. Sin embargo, solo pueden contener elementos únicos.
Resulta que las tuplas funcionan casi exactamente de la misma manera que las listas, excepto por su inmutabilidad.
Iterando
Determinar si un objeto está presente
fuente
Lista de rendimiento:
Establecer rendimiento:
Es posible que desee considerar las tuplas, ya que son similares a las listas, pero no se pueden modificar. Ocupan un poco menos de memoria y son más rápidos de acceder. No son tan flexibles pero son más eficientes que las listas. Su uso normal es servir como teclas de diccionario.
Los conjuntos también son estructuras de secuencia pero con dos diferencias de listas y tuplas. Aunque los conjuntos tienen un orden, ese orden es arbitrario y no está bajo el control del programador. La segunda diferencia es que los elementos en un conjunto deben ser únicos.
set
por definición. [ pitón | wiki ].fuente
set
enlace de tipo incorporado ( docs.python.org/2/library/stdtypes.html#set ), no lasets
biblioteca en desuso . Segundo, "Los conjuntos también son estructuras de secuencia", lea lo siguiente desde el enlace de tipo incorporado: "Al ser una colección desordenada, los conjuntos no registran la posición del elemento ni el orden de inserción. Por consiguiente, los conjuntos no admiten indexación, segmentación u otros comportamiento similar a la secuencia ".range
no eslist
.range
es una clase especial con__contains__
método mágico personalizado .xrange
)Set
gana debido a comprobaciones 'contiene' casi instantáneas: https://en.wikipedia.org/wiki/Hash_tableImplementación de la lista : generalmente una matriz, de bajo nivel cerca del metal, buena para iteración y acceso aleatorio por índice de elemento.
Establecer implementación: https://en.wikipedia.org/wiki/Hash_table , no itera en una lista, pero encuentra el elemento calculando un hash de la clave, por lo que depende de la naturaleza de los elementos clave y el hash función. Similar a lo que se usa para dict. Sospecho que
list
podría ser más rápido si tiene muy pocos elementos (<5), cuanto mayor sea el recuento de elementos, mejorset
funcionará para una verificación de contenido. También es rápido para la adición y eliminación de elementos. ¡También ten en cuenta que construir un set tiene un costo!NOTA : Si
list
ya está ordenado, la búsquedalist
podría ser bastante rápida, pero en los casos habituales aset
es más rápido y sencillo para verificaciones de contenido.fuente
tl; dr
Las estructuras de datos (DS) son importantes porque se utilizan para realizar operaciones en los datos, lo que básicamente implica: tomar alguna entrada , procesarla y devolver la salida .
Algunas estructuras de datos son más útiles que otras en algunos casos particulares. Por lo tanto, es bastante injusto preguntar qué (DS) es más eficiente / rápido. Es como preguntar qué herramienta es más eficiente entre un cuchillo y un tenedor. Quiero decir que todo depende de la situación.
Liza
Una lista es una secuencia mutable , que generalmente se usa para almacenar colecciones de artículos homogéneos .
Conjuntos
Un objeto conjunto es una colección desordenada de objetos hashables distintos . Se usa comúnmente para probar la membresía, eliminar duplicados de una secuencia y calcular operaciones matemáticas como intersección, unión, diferencia y diferencia simétrica.
Uso
De algunas de las respuestas, está claro que una lista es bastante más rápida que un conjunto al iterar sobre los valores. Por otro lado, un conjunto es más rápido que una lista cuando se verifica si un elemento está contenido dentro de él. Por lo tanto, lo único que puede decir es que una lista es mejor que un conjunto para algunas operaciones particulares y viceversa.
fuente
Estaba interesado en los resultados al verificar, con CPython, si un valor es uno de un pequeño número de literales.
set
gana en Python 3 vstuple
,list
yor
:Salida:
Para 3 a 5 literales,
set
aún gana por un amplio margen, y seor
convierte en el más lento.En Python 2,
set
siempre es el más lento.or
es el más rápido para 2 a 3 literales,tuple
ylist
es más rápido con 4 o más literales. No podía distinguir la velocidad deltuple
frentelist
.Cuando los valores a probar se almacenaron en caché en una variable global fuera de la función, en lugar de crear el literal dentro del bucle,
set
ganó cada vez, incluso en Python 2.Estos resultados se aplican a CPython de 64 bits en un Core i7.
fuente
Recomendaría una implementación de Set donde el caso de uso se limita a hacer referencia o buscar la existencia y la implementación de Tuple donde el caso de uso requiere que realice la iteración. Una lista es una implementación de bajo nivel y requiere una sobrecarga de memoria significativa.
fuente
Salida después de comparar 10 iteraciones para las 3: Comparación
fuente
Los conjuntos son más rápidos, además obtienes más funciones con conjuntos, como digamos que tienes dos conjuntos:
Podemos unir fácilmente dos conjuntos:
Descubra lo que es común en ambos:
Descubre qué es diferente en ambos:
¡Y mucho más! ¡Pruébalos, son divertidos! Además, si tiene que trabajar en los diferentes valores dentro de 2 listas o valores comunes dentro de 2 listas, prefiero convertir sus listas en conjuntos, y muchos programadores lo hacen de esa manera. Espero que te ayude :-)
fuente