Jak duża może być lista w Pythonie?

119

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.?

Oddany
źródło

Odpowiedzi:

193

Zgodnie z kodem źródłowym maksymalny rozmiar listy to PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXjest 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.

Nieznany
źródło
4
Dlaczego tak jest sizeof(PyObject*) == 4?? Co to oznacza?
Matt,
4
@Matt, to liczba bajtów pojedynczego 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.
Antonio Ragagnin
1
Warto zauważyć (jak wskazuje odpowiedź Álvaro Justena), że na innych maszynach, szczególnie tych z systemami 64-bitowymi, wartość PY_SSIZE_T_MAXmoże być bardzo duża.
ClydeTheGhost
@ClydeTheGhost, czy możesz określić, czy te z systemami 64-bitowymi mogą również mieć mniejszy maksymalny rozmiar niż 536 870 912 elementów? Albo że mogą się znacznie różnić, ale zawsze mają maksymalny rozmiar równy lub większy niż 536 870 912 elementów?
przy
1
@at Wartość maksymalna dla systemu 64-bitowego zawsze będzie równa lub większa niż dla systemu 32-bitowego.
ClydeTheGhost
72

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
Álvaro Justen
źródło
jak to odpowiada na pytanie
ldgorman
11
@ldgorman, sys.maxsizeto odpowiedź na pytanie. Różne architektury obsługują różne maksima.
Simon Kuang
2
9223372036854775807 elementów? Naprawdę? To również znacznie różni się od odpowiedzi, która otrzymała najwięcej głosów.
akki
13
@akki akceptowana odpowiedź dotyczy systemu 32-bitowego. Ponieważ jest rok 2016, zakładam, że korzystasz z systemu 64-bitowego, a zatem odpowiedź jest poprawna
Brian Leach,
2
To powinna być wybrana odpowiedź.
Lokesh
26

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.

Nadia Alramli
źródło
20
Taki sposób pomiaru czasu może wprowadzać w błąd - większość czasu spędza się na uruchamianiu interpretera Pythona. Lepszym sposobem jest: python -m timeit.py "l = range (12000); l = sortowane (l, reverse = True)". Na mojej maszynie daje to około 1/20 czasu dla tego przykładu.
dF.
5
@dF, masz rację co do dokładności. Dzięki, że to zauważyłeś. Chciałem tylko coś udowodnić. I przykład to potwierdza.
Nadia Alramli
13
@dF: Wspaniale! 0,024 s to dla mnie o wiele za długo i cieszę się, że mogę przestać się tym martwić.
Thomas Edleson,
6

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 .

Doug
źródło
5

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).

cdleary
źródło
4

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.

AlbertoPL
źródło
3

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 listi dictrównież, zgodnie z dokumentacją

yunus
źródło
1
to nie jest dokumentacja
Boris
1

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.

Wayne Koorts
źródło
4
Generalnie prawda, ale nie wszystkie - dołączanie pozostaje zamortyzowane w stałym czasie, niezależnie od rozmiaru tablicy.
cdleary
0

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

wprowadź opis obrazu tutaj

user2063329
źródło
1
To byłaby świetna odpowiedź, gdybyś rozszerzył nieco szczegóły i jak inni mogą znaleźć własne ograniczenia.
Shayaan,
-16

Nie ma ograniczenia liczby list. Głównym powodem, który powoduje twój błąd, jest pamięć RAM. Proszę zwiększyć rozmiar pamięci.

Haimei
źródło
9
-1, ponieważ w rzeczywistości nie odpowiada na pytanie i wprowadza w błąd, ponieważ (jak pokazują inne odpowiedzi) lista ma rzeczywiście maksymalny rozmiar.
ClydeTheGhost