Odpowiedzi:
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.
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
Największa dodatnia liczba całkowita obsługiwana przez typ Py_ssize_t platformy, a tym samym maksymalny rozmiar list, ciągów znaków, dykt i wielu innych kontenerów.
Na moim komputerze (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
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ć:
l = range(12000)
l = sorted(l, reverse=True)
Uruchomienie tych linii na moim komputerze zajęło:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Ale jasne, jak wszyscy mówili. Im większa macierz, tym wolniejsze będą operacje.
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 .
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ści O(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).
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 rozmiar list
i dict
również, zgodnie z dokumentacją
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.
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
Nie ma ograniczenia liczby list. Głównym powodem, który powoduje twój błąd, jest pamięć RAM. Proszę zwiększyć rozmiar pamięci.
sizeof(PyObject*) == 4?
? Co to oznacza?