Która struktura danych w Pythonie jest bardziej wydajna / szybsza? Zakładając, że kolejność nie jest dla mnie ważna, a mimo to sprawdzałbym duplikaty, czy zestaw Python jest wolniejszy niż lista Python?
python
list
performance
data-structures
set
Mantas Vidutis
źródło
źródło
Listy są nieco szybsze niż zestawy, gdy chcesz po prostu iterować po wartościach.
Zestawy są jednak znacznie szybsze niż listy, jeśli chcesz sprawdzić, czy element jest w nim zawarty. Mogą jednak zawierać tylko unikalne przedmioty.
Okazuje się, że krotki działają prawie dokładnie tak samo jak listy, z wyjątkiem ich niezmienności.
Iteracja
Sprawdź, czy obiekt jest obecny
źródło
Wydajność listy:
Ustaw wydajność:
Możesz rozważyć stosowanie Tuple, ponieważ są one podobne do list, ale nie można ich modyfikować. Zajmują nieco mniej pamięci i są szybciej dostępne. Nie są tak elastyczne, ale są bardziej wydajne niż listy. Zwykle służą jako klucze słownikowe.
Zbiory są również strukturami sekwencji, ale z dwiema różnicami od list i krotek. Chociaż zestawy mają kolejność, kolejność ta jest dowolna i nie podlega kontroli programisty. Druga różnica polega na tym, że elementy zestawu muszą być unikalne.
set
zgodnie z definicją. [ python | wiki ].źródło
set
wbudowanego łącza typu ( docs.python.org/2/library/stdtypes.html#set ), a nie przestarzałejsets
biblioteki. Po drugie, „Zestawy są również strukturami sekwencji”, przeczytaj następujące informacje z wbudowanego łącza typu: „Będąc kolekcją nieuporządkowaną, zestawy nie rejestrują pozycji elementu ani kolejności wstawiania. W związku z tym zestawy nie obsługują indeksowania, dzielenia ani innych zachowanie podobne do sekwencji ”.range
nie jestlist
.range
to specjalna klasa z niestandardową__contains__
metodą magiczną.xrange
)Set
wygrywa dzięki prawie natychmiastowym czekom „zawiera”: https://en.wikipedia.org/wiki/Hash_tableImplementacja listy : zwykle tablica, niski poziom blisko metalu, dobry do iteracji i losowy dostęp według indeksu elementów.
Implementacja zestawu : https://en.wikipedia.org/wiki/Hash_table , nie iteruje się na liście, ale znajduje element, obliczając skrót z klucza, więc zależy to od natury kluczowych elementów i skrótu funkcjonować. Podobne do tego, co jest używane do dyktowania. Podejrzewam, że
list
może być szybszy, jeśli masz bardzo mało elementów (<5), im większy element, tym lepszaset
wydajność przy sprawdzaniu zawartości. Jest również szybki do dodawania i usuwania elementów. Pamiętaj też, że zbudowanie zestawu ma swój koszt!UWAGA : Jeśli
list
jest już posortowane, wyszukiwanielist
może być dość szybkie, ale w zwykłych przypadkach aset
jest szybsze i prostsze w przypadku sprawdzania zawartości.źródło
tl; dr
Struktury danych (DS) są ważne, ponieważ służą do wykonywania operacji na danych, co w zasadzie implikuje: weź trochę danych wejściowych , przetworz je i zwróć dane wyjściowe .
Niektóre struktury danych są bardziej przydatne niż inne w niektórych szczególnych przypadkach. Dlatego niesprawiedliwe jest pytanie, które (DS) jest bardziej wydajne / szybkie. To jak pytanie, które narzędzie jest bardziej wydajne między nożem a widelcem. Mam na myśli, że wszystko zależy od sytuacji.
Listy
Lista jest zmienną sekwencją , zwykle używaną do przechowywania kolekcji jednorodnych przedmiotów .
Zestawy
Ustawiony obiekt to nieuporządkowana kolekcja różnych obiektów możliwych do skrótu . Jest powszechnie używany do testowania członkostwa, usuwania duplikatów z sekwencji i obliczania operacji matematycznych, takich jak przecięcie, połączenie, różnica i różnica symetryczna.
Stosowanie
Z niektórych odpowiedzi jasno wynika, że lista jest znacznie szybsza niż zestaw podczas iteracji po wartościach. Z drugiej strony zestaw jest szybszy niż lista podczas sprawdzania, czy element jest w nim zawarty. Dlatego jedyną rzeczą, którą możesz powiedzieć, jest to, że lista jest lepsza niż zestaw dla niektórych konkretnych operacji i na odwrót.
źródło
Byłem zainteresowany wynikami podczas sprawdzania za pomocą CPython, czy wartość jest jedną z niewielkiej liczby literałów.
set
wygrywa Pythonie 3 vstuple
,list
ior
:Wynik:
Dla 3 do 5 literałów
set
nadal wygrywa z szerokim marginesem ior
staje się najwolniejszy.W Pythonie 2
set
jest zawsze najwolniejszy.or
jest najszybszy dla 2 do 3 literałówtuple
ilist
jest szybszy z 4 lub więcej literałami. Nie mogłem odróżnić prędkośćtuple
vslist
.Gdy wartości do testowania były buforowane w zmiennej globalnej poza funkcją, zamiast tworzyć literał w pętli,
set
wygrywało za każdym razem, nawet w Pythonie 2.Te wyniki dotyczą 64-bitowego CPython na Core i7.
źródło
Poleciłbym implementację Set, w której przypadek użycia ogranicza się do odwoływania się lub wyszukiwania istnienia, oraz implementację Tuple, w której przypadek użycia wymaga wykonania iteracji. Lista jest implementacją niskiego poziomu i wymaga znacznego obciążenia pamięci.
źródło
Wyjście po porównaniu 10 iteracji dla wszystkich 3: Porównanie
źródło
Zestawy są szybsze, ponadto dostajesz więcej funkcji dzięki zestawom, na przykład powiedzmy, że masz dwa zestawy:
Możemy łatwo połączyć dwa zestawy:
Dowiedz się, co jest wspólne w obu:
Dowiedz się, co różni się w obu:
I wiele więcej! Wypróbuj je, są fajne! Co więcej, jeśli musisz pracować nad różnymi wartościami z 2 list lub wspólnymi wartościami z 2 list, wolę przekonwertować twoje listy na zestawy, a wielu programistów robi to w ten sposób. Mam nadzieję, że to ci pomoże :-)
źródło