Python Sets vs Listas

En Python, ¿qué estructura de datos es más eficiente / rápida? Suponiendo que el orden no es importante para mí y de todos modos estaría buscando duplicados, ¿es un conjunto de Python más lento que una lista de Python?

Depende de lo que pretendes hacer con él.

Los conjuntos son significativamente más rápidos cuando se trata de determinar si un objeto está presente en el conjunto (como en x in s ), pero son más lentos que las listas cuando se trata de iterar sobre su contenido.

Puede usar el módulo timeit para ver cuál es más rápido para su situación.

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 comprobar si un elemento está contenido dentro de é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

 >>> def iter_test(iterable): ... for i in iterable: ... pass ... >>> from timeit import timeit >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = set(range(10000))", ... number=100000) 12.666952133178711 >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = list(range(10000))", ... number=100000) 9.917098999023438 >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = tuple(range(10000))", ... number=100000) 9.865639209747314 

Determine si un objeto está presente

 >>> def in_test(iterable): ... for i in range(1000): ... if i in iterable: ... pass ... >>> from timeit import timeit >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = set(range(1000))", ... number=10000) 0.5591847896575928 >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = list(range(1000))", ... number=10000) 50.18339991569519 >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = tuple(range(1000))", ... number=10000) 51.597304821014404 

Rendimiento de la lista:

 >>> import timeit >>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000) 0.008128150348026608 

Establecer el rendimiento:

 >>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000) 0.005674857488571661 

Es posible que desee considerar las tuplas ya que son similares a las listas pero no pueden modificarse. Ocupan un poco menos de memoria y son de acceso más rápido. No son tan flexibles pero son más eficientes que las listas. Su uso normal es servir como claves 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 progtwigdor. La segunda diferencia es que los elementos de un conjunto deben ser únicos.

set por definición. [ Python | wiki ].

 >>> x = set([1, 1, 2, 2, 3, 3]) >>> x {1, 2, 3} 

Set victorias debido a cheques casi instantáneos ‘contiene’: https://en.wikipedia.org/wiki/Hash_table

Implementación de la lista : por lo general, una matriz, bajo nivel cerca del metal, buena para iteración y acceso aleatorio por índice de elementos.

Establecer implementación: https://en.wikipedia.org/wiki/Hash_table , no itera en una lista, pero encuentra el elemento al calcular 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 la list podría ser más rápida si tiene muy pocos elementos (<5), cuanto mayor sea el número de elementos, mejor será el rendimiento del set para un control de contenido. También es rápido para la adición y eliminación de elementos.

NOTA : Si la list ya está ordenada, la búsqueda podría ser bastante rápida, pero para los casos habituales, un set es más rápido y más simple, ya que contiene cheques.

Recomendaría una implementación de Set donde el caso de uso sea el límite para hacer referencia o buscar la existencia y una implementación de Tuple donde el caso de uso requiera que usted realice una iteración. Una lista es una implementación de bajo nivel y requiere una sobrecarga de memoria significativa.