Jak duża może być lista w Pythonie? Potrzebuję listy około 12000 elementów. Czy nadal będę mógł uruchamiać metody listowe, takie jak sortowanie itp.?
119
Zgodnie z kodem źródłowym maksymalny rozmiar listy to PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
jest zdefiniowany w pyport.h to be((size_t) -1)>>1
W zwykłym systemie 32-bitowym jest to (4294967295/2) / 4 lub 536870912.
Dlatego maksymalny rozmiar listy Pythona w systemie 32-bitowym to 536 870 912 elementów.
Dopóki liczba posiadanych elementów jest równa lub mniejsza od tej, wszystkie funkcje listy powinny działać poprawnie.
sizeof(PyObject*) == 4?
? Co to oznacza?PyObject *
. To jest tak zwany wskaźnik (rozpoznajesz go po gwiazdce na końcu). Wskaźniki mają 4 bajty długości i przechowują adres pamięci do przydzielonego obiektu. Mają „tylko” 4 bajty, ponieważ dzięki 4 bajtom można zaadresować każdy element w pamięci dzisiejszych komputerów.PY_SSIZE_T_MAX
może być bardzo duża.Jak mówi dokumentacja Pythona :
sys.maxsize
Na moim komputerze (Linux x86_64):
źródło
sys.maxsize
to odpowiedź na pytanie. Różne architektury obsługują różne maksima.Jasne, że jest OK. Właściwie możesz łatwo zobaczyć:
Uruchomienie tych linii na moim komputerze zajęło:
Ale jasne, jak wszyscy mówili. Im większa macierz, tym wolniejsze będą operacje.
źródło
W zwykłym kodzie stworzyłem listy z milionami elementów. Uważam, że implementacja list w Pythonie jest ograniczona tylko ilością pamięci w systemie.
Ponadto metody / funkcje listy powinny nadal działać pomimo rozmiaru listy.
Jeśli zależy Ci na wydajności, warto zajrzeć do biblioteki takiej jak NumPy .
źródło
Charakterystyki wydajności list są opisane w Effbot.
Listy Pythona są w rzeczywistości zaimplementowane jako wektor do szybkiego dostępu swobodnego, więc kontener zasadniczo pomieści tyle elementów, ile jest miejsca w pamięci. (Potrzebujesz miejsca na wskaźniki zawarte na liście, a także miejsca w pamięci na wskazywane obiekty).
Dołączanie jest
O(1)
(zamortyzowana stała złożoność), jednak wstawianie do / usuwanie od środka sekwencji będzie wymagało zmiany kolejnościO(n)
(złożoność liniowa), która będzie wolniejsza wraz z liczbą elementów na liście.Twoje pytanie dotyczące sortowania jest bardziej złożone, ponieważ operacja porównania może zająć nieograniczoną ilość czasu. Jeśli wykonujesz naprawdę powolne porównania, zajmie to dużo czasu, chociaż nie jest to wina typu danych listy Pythona .
Odwrócenie zajmuje tylko tyle czasu, ile potrzeba do zamiany wszystkich wskaźników na liście (koniecznie
O(n)
(złożoność liniowa), ponieważ dotykasz każdego wskaźnika raz).źródło
12000 elementów to nic w Pythonie ... i tak naprawdę liczba elementów może sięgać tak daleko, jak interpreter Pythona ma pamięć w twoim systemie.
źródło
To zależy od różnych systemów (w zależności od pamięci RAM). Najłatwiej to sprawdzić
import six six.MAXSIZE 9223372036854775807
Daje to maksymalny rozmiarlist
idict
również, zgodnie z dokumentacjąźródło
Powiedziałbym, że ogranicza Cię tylko całkowita ilość dostępnej pamięci RAM. Oczywiście im większa tablica, tym dłuższe będą na niej operacje.
źródło
Mam to stąd w systemie x64 bit: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 maja 2018, 01:54:01) [MSC v.1913 64-bitowy (AMD64)] na win32
źródło
Nie ma ograniczenia liczby list. Głównym powodem, który powoduje twój błąd, jest pamięć RAM. Proszę zwiększyć rozmiar pamięci.
źródło