Zastanawiałem się, czy powinienem mieć swoją strukturę danych jako zestaw lub listę. Przeważnie wykonam operacje setowe, ale ostatecznie będę musiał je posortować.Ogromna różnica w czasie pomiędzy sortowaniem zestawu a sortowaniem listy w Pythonie
Zastanawiam się, czy powinienem najpierw ustawić zestaw, a następnie użyć sorted(list(my_set))
, lub po prostu posortować zestaw natychmiast sorted(my_set)
. Prawdopodobnie mógłbym rozważyć ogólną fazę "listowania", ponieważ posiadanie uporządkowanej iteracji w tym momencie może i tak mieć sens.
Postanowiłem przetestować to, oczekując, że lista będzie szybsza.
Benchmarker:
import time
def sorter(x):
t1 = time.time()
for i in range(1000000):
sorted(x)
return time.time() - t1
danych:
one = range(1000)
a1 = list(one)
b1 = set(one)
sorter(a1)
# time: 16.5 s
sorter(b1)
# time: 20.7 s
Później zrozumiałem, to może mieć do czynienia z faktem, że elementy są już na swoim miejscu, a pamiętał this amazing question & answer.
Następnie próbowałem jakieś losowe dane:
two = numpy.random.randint(1, 1000, 1000)
a2 = list(two)
b2 = set(two)
z rezultatów:
sorter(a2)
# time: 4min 49s
sorter(b2)
# time: 18.9 s
ogromna różnica, co się dzieje?
Bonus: Pojawia się nawet w czasie jednej minuty, że sorted(set(a_list))
jest imponująco szybszy niż sorted(a_list)
.
Rzeczywiście w drugim przypadku mogą występować duplikaty, które zostaną przefiltrowane, a co za tym idzie przyspieszenie sortowania.
@Rufflewind Bah, powinienem był sprawdzić typ. Zawsze zakładałem, że "sorted" zwróci listę (ponieważ użyłem jej tylko na liście w sposób naturalny). Teraz jestem ciekawa, czy jeśli zmienimy kolejność po zestawie, czy to zmieni kolejność? – PascalVKooten
@PascalVKooten W rzeczywistości zwraca listę. – PascalVKooten
Wycofałem swój komentarz, ponieważ mogą istnieć uzasadnione powody, aby mieć * posortowaną wersję zestawu *, ale jak już odkryłeś, posortowany zbiór nie jest już zbiorem. – Rufflewind