¿Cuál es la "forma [...] obvia" de agregar todos los elementos de un iterable a uno existente set
?
python
set
conventions
iterable
Ian Mackinnon
fuente
fuente
set
constructor toma un iterable como argumento.{1, 2, 3}
en Python 3, mientras que estabaset([1, 2, 3])
en Python 2.Para el beneficio de cualquier persona que pueda creer, por ejemplo, que hacer
aset.add()
un ciclo tendría un rendimiento competitivoaset.update()
, aquí hay un ejemplo de cómo puede poner a prueba sus creencias rápidamente antes de hacerlo público:Parece que el costo por artículo del enfoque de bucle es TRES veces mayor que el del
update
enfoque.El uso
|= set()
cuesta aproximadamente 1.5update
veces lo que hace, pero la mitad de lo que hace agregar cada elemento individual en un ciclo.fuente
Puede usar la función set () para convertir un iterable en un conjunto, y luego usar el operador de actualización de conjunto estándar (| =) para agregar los valores únicos de su nuevo conjunto al existente.
fuente
.update
tiene el beneficio de que el argumento puede ser iterable, no necesariamente un conjunto, a diferencia del RHS del|=
operador en su ejemplo.|
para unión,&
intersección y^
para obtener elementos que están en uno u otro pero no en ambos. Pero en un lenguaje de tipo dinámico donde a veces es difícil leer el código y conocer los tipos de objetos que vuelan, me siento reacio a usar estos operadores. Alguien que no los reconoce (o tal vez ni siquiera se da cuenta de que Python permite operadores como estos) podría confundirse y pensar que están ocurriendo algunas operaciones lógicas o bit a bit extrañas. Sería bueno si estos operadores trabajaran también en otros iterables ....update()
y agregué elementos individuales en un bucle. Descubrí que.update()
fue más rápido.Solo una actualización rápida, tiempos usando Python 3:
los resultados son:
fuente
Usa la comprensión de la lista.
Cortocircuito en la creación de iterables usando una lista, por ejemplo :)
[Editar: se perdió la parte de la pregunta establecida]
fuente
Para que conste, creo que la afirmación de que "debería haber una, y preferiblemente solo una, forma obvia de hacerlo". es falso Supone que muchas personas de mentalidad técnica hacen, que todos piensan igual. Lo que es obvio para una persona no es tan obvio para otra.
Yo diría que mi solución propuesta es claramente legible y hace lo que usted pide. No creo que haya ningún éxito en el rendimiento involucrado, aunque admito que podría estar perdiendo algo. Pero a pesar de todo eso, puede que no sea obvio y preferible para otro desarrollador.
fuente
aset.update(iterable)
repite a velocidad C, mientras que sefor item in iterable: aset.add(item)
repite a velocidad de Python, con una búsqueda de método y una llamada de método (¡¡¡aarrgghh !!) por elemento.