Mi chiedevo se avrei dovuto avere la mia struttura dati come un set o una lista. Principalmente farò operazioni di set, ma alla fine avrò bisogno di ordinarlo.Enorme differenza di tempo tra l'ordinamento di un set e l'ordinamento di un elenco in Python
Mi chiedevo se avrei dovuto prima creare un elenco e quindi utilizzare sorted(list(my_set))
o semplicemente ordinare immediatamente il set sorted(my_set)
. Probabilmente, potrei considerare una fase generale di "elencare", poiché avere un iterabile ordinato in quel momento potrebbe avere comunque senso.
Quindi ho deciso di testarlo, aspettandomi che una lista fosse più veloce.
Benchmarker:
import time
def sorter(x):
t1 = time.time()
for i in range(1000000):
sorted(x)
return time.time() - t1
dati:
one = range(1000)
a1 = list(one)
b1 = set(one)
sorter(a1)
# time: 16.5 s
sorter(b1)
# time: 20.7 s
Mi resi conto allora che potrebbe avere a che fare con il fatto che gli elementi sono già in atto, e ricordato this amazing question & answer.
Poi, ho provato un po 'di dati casuali:
two = numpy.random.randint(1, 1000, 1000)
a2 = list(two)
b2 = set(two)
Con i risultati:
sorter(a2)
# time: 4min 49s
sorter(b2)
# time: 18.9 s
differenza enorme, che cosa sta succedendo?
Bonus: appare anche in un istante di un minuto, che sorted(set(a_list))
è notevolmente più veloce di sorted(a_list)
.
Infatti nel secondo caso, possono esserci duplicati che verrebbero filtrati e quindi accelerano l'ordinamento.
@Rufflewind Bah, avrei dovuto controllare il tipo. Ho sempre dato per scontato 'ordinato' per restituire una lista (dato che l'ho usata solo su una lista in modo naturale). Ora sono curioso, se dovessimo riannodare il set dopo averlo ordinato, cambierà l'ordine? – PascalVKooten
@PascalVKooten In realtà, restituisce una lista. – PascalVKooten
Ho ritirato il mio commento perché potrebbero esserci motivi legittimi per avere una * versione ordinata di un set *, ma come hai scoperto, un set ordinato non è più un set. – Rufflewind