Czy to jest połączona lista, tablica? Rozejrzałem się i znalazłem tylko zgadujących ludzi. Moja znajomość języka C nie jest wystarczająco dobra, aby spojrzeć na kod źródłowy.
183
Czy to jest połączona lista, tablica? Rozejrzałem się i znalazłem tylko zgadujących ludzi. Moja znajomość języka C nie jest wystarczająco dobra, aby spojrzeć na kod źródłowy.
To tablica dynamiczna . Praktyczny dowód: indeksowanie trwa (oczywiście z bardzo małymi różnicami (0,0013 µs!)) W tym samym czasie niezależnie od indeksu:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Byłbym zdumiony, gdyby IronPython lub Jython korzystały z list połączonych - zrujnowałyby one wydajność wielu wielu powszechnie używanych bibliotek zbudowanych przy założeniu, że listy są tablicami dynamicznymi.
x=[None]*1000
, przez co pomiar ewentualnych różnic w dostępie do listy jest raczej nieprecyzyjny. Musisz oddzielić inicjalizację:-s "x=[None]*100" "x[0]"
W rzeczywistości kod C jest dość prosty. Rozszerzając jedno makro i przycinając nieistotne komentarze, znajduje się podstawowa struktura
listobject.h
, która definiuje listę jako:PyObject_HEAD
zawiera liczbę odwołań i identyfikator typu. Jest to więc wektor / tablica z nadmierną alokacją. Kod służący do zmiany rozmiaru takiej tablicy, gdy jest pełna, znajduje się wlistobject.c
. W rzeczywistości nie podwaja tablicy, ale rośnie poprzez przydzielaniedo pojemności za każdym razem, gdzie
newsize
jest żądany rozmiar (niekoniecznieallocated + 1
dlatego, żeextend
zamiast tego można podać dowolną liczbę elementówappend
je pojedynczo).Zobacz także Python FAQ .
źródło
array
preferowany jest moduł lub NumPy.W CPythonie listy są tablicami wskaźników. Inne implementacje Pythona mogą przechowywać je na różne sposoby.
źródło
Jest to zależne od implementacji, ale IIRC:
ArrayList
W ten sposób wszyscy mają dostęp losowy O (1).
źródło
O(1)
indeksowanie list jest dość powszechnym i słusznym założeniem, żadna implementacja nie odważyłaby się go złamać.Proponuję artykuł Laurenta Luce "Implementacja listy Pythona" . Było dla mnie bardzo przydatne, ponieważ autor wyjaśnia, w jaki sposób lista jest zaimplementowana w CPythonie i używa do tego doskonałych diagramów.
...
...
...
...
źródło
aggregation
niecomposition
. Żałuję, że nie ma też listy kompozycji.Zgodnie z dokumentacją ,
źródło
Jak powiedzieli inni powyżej, listy (gdy są znacznie duże) są implementowane przez przydzielenie określonej ilości miejsca i, jeśli to miejsce powinno się wypełnić, przydzielenie większej ilości miejsca i skopiowanie elementów.
Aby zrozumieć, dlaczego metoda jest amortyzowana O (1), bez utraty ogólności, załóżmy, że wstawiliśmy a = 2 ^ n elementów, a teraz musimy podwoić naszą tabelę do rozmiaru 2 ^ (n + 1). Oznacza to, że obecnie wykonujemy 2 ^ (n + 1) operacje. W ostatniej kopii wykonaliśmy 2 ^ n operacji. Wcześniej zrobiliśmy 2 ^ (n-1) ... aż do 8,4,2,1. Teraz, jeśli dodamy to, otrzymamy 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) suma wpłat (tj. O (1) amortyzowany czas). Należy również zauważyć, że jeśli tabela umożliwia usuwanie, zmniejszanie tabeli musi być wykonane przy innym współczynniku (np. 3x)
źródło
Lista w Pythonie jest czymś w rodzaju tablicy, w której można przechowywać wiele wartości. Lista jest zmienna, co oznacza, że możesz ją zmienić. Co ważniejsze, powinieneś wiedzieć, kiedy tworzymy listę, Python automatycznie tworzy reference_id dla tej zmiennej listy. Jeśli zmienisz to poprzez przypisanie innym zmiennej, lista główna ulegnie zmianie. Spróbujmy na przykładzie:
Dodajemy,
my_list
ale nasza główna lista uległa zmianie. Oznacza to, że lista środków nie została przypisana jako lista kopii przypisana jako odniesienie.źródło
W CPythonie lista jest zaimplementowana jako tablica dynamiczna, a więc kiedy dodajemy w tym czasie nie tylko dodawane jest jedno makro, ale przydzielane jest trochę więcej miejsca, aby za każdym razem nie dodawać nowego miejsca.
źródło