create - set string python
Forma rápida de extender un conjunto si sabemos que los elementos son únicos. (4)
Como señala mgilson, puede usar la update
para actualizar un conjunto en el lugar de otro conjunto. Eso realmente funciona un poco más rápido:
def union():
i = set(range(10000))
j = set(range(5000, 15000))
return i.union(j)
def update():
i = set(range(10000))
j = set(range(5000, 15000))
i.update(j)
return i
timeit.Timer(union).timeit(10000) # 10.351907968521118
timeit.Timer(update).timeit(10000) # 8.83384895324707
Estoy realizando múltiples iteraciones del tipo:
masterSet=masterSet.union(setA)
A medida que el conjunto crece, el tiempo que se tarda en realizar estas operaciones está creciendo (como se podría esperar, supongo).
¿Espero que se tome el tiempo para verificar si cada elemento de setA ya está en masterSet?
Mi pregunta es que si SÉ que masterSet no contiene ninguno de los elementos en setA, ¿puedo hacerlo más rápido?
[ACTUALIZAR]
Dado que esta pregunta sigue atrayendo puntos de vista, pensé que aclararía algunas cosas de los comentarios y respuestas a continuación:
Sin embargo, al realizar iteraciones, existían muchas iteraciones en las que sabía que setA
sería distinto de masterSet
debido a la forma en que se construyó (sin tener que procesar ninguna verificación), pero en algunas iteraciones necesitaba la comprobación de unicidad.
Me pregunté si habría una manera de "decirle" al procedimiento masterSet.union()
no se moleste con el control de la unidad en esta ocasión, ya que sé que esta es distinta de la masterSet
. Perhpas llamando a algún procedimiento diferente " .unionWithDistinctSet()
" o algo así.
Creo que las respuestas han sugerido que esto no es posible (y que las operaciones de configuración realmente deberían ser lo suficientemente rápidas de todos modos), pero usar masterSet.update(setA)
lugar de union como un poco más rápido aún.
He aceptado la respuesta más clara en ese sentido, resolví el problema que tenía en ese momento y seguí adelante con mi vida, pero ¿me encantaría escuchar si mi hipotética .unionWithDistinctSet()
pudiera existir?
Por supuesto, renunciar a esta verificación podría ser un gran ahorro cuando el __eq__(..)
es muy costoso. En la implementación de CPython, se __eq__(..)
con cada elemento que ya se encuentra en el conjunto que hace hash al mismo número. (Referencia: código fuente para set
.)
Sin embargo, nunca habrá esta funcionalidad en un millón de años, porque abre otra forma de violar la integridad de un conjunto. El problema asociado con eso supera con creces la ganancia de rendimiento (normalmente despreciable). Si bien si esto se determina como un cuello de botella en el rendimiento, no es difícil escribir una extensión C ++ y usar su <set>
STL, que debería ser más rápido en uno o más órdenes de magnitud.
Puede usar set.update
para actualizar su conjunto maestro en su lugar. Esto ahorra la asignación de un nuevo conjunto todo el tiempo, por lo que debería ser un poco más rápido que set.union
...
>>> s = set(range(3))
>>> s.update(range(4))
>>> s
set([0, 1, 2, 3])
Por supuesto, si estás haciendo esto en un bucle:
masterSet = set()
for setA in iterable:
masterSet = masterSet.union(setA)
Puede obtener un aumento de rendimiento haciendo algo como:
masterSet = set().union(*iterable)
En última instancia, la prueba de pertenencia de un conjunto es O (1) (en el caso promedio), por lo que probar si el elemento ya está contenido en el conjunto no es realmente un gran éxito de rendimiento.
Si sabe que sus elementos son únicos, un conjunto no es necesariamente la mejor estructura.
Una lista simple es mucho más rápida de extender.
masterList = list(masterSet)
masterList.extend(setA)