2009-05-12 20 views
88

W języku Python, jak duża może być tablica/lista? Potrzebuję tablicy około 12000 elementów. Czy nadal będę mógł korzystać z metod tablic/list, takich jak sortowanie itp.?Jak duża może być tablica Pythona?

+9

Istnieje duża różnica między tablicami i listami w pythonie. – recursive

Odpowiedz

149

Zgodnie z source code, maksymalny rozmiar listy to PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAX jest zdefiniowana w pyport.h być ((size_t) -1)>>1

na regularnym układzie 32-bitowego, to jest (4294967295/2)/4 lub 536870912.

Zatem maksymalna wielkość listy pytona na 32- system to elementy: 536,870,912.

Dopóki liczba posiadanych elementów jest równa lub niższa od tej wartości, wszystkie funkcje listy powinny działać poprawnie.

+2

Dlaczego jest 'sizeof (PyObject *) == 4?'? Co to oznacza? – Matt

+3

@Matt, jest liczbą bajtów pojedynczego 'PyObject *'. To jest tak zwany wskaźnik (rozpoznajesz je z powodu asterixu na końcu). Wskaźniki mają długość 4 bajtów i przechowują adres pamięci dla przydzielonego obiektu. Są one "tylko" 4 bajtowe, ponieważ z 4 bajtami można zaadresować każdy element w pamięci dzisiejszych komputerów. –

+0

Warto zauważyć (jak pokazuje odpowiedź Álvaro Justena), że na innych komputerach, w szczególności tych działających w systemach 64-bitowych, wartość 'PY_SSIZE_T_MAX' może być bardzo duża. –

4

12000 elementów jest niczym w języku Python ... i faktycznie liczba elementów może sięgać tak daleko, jak interpreter Pythona ma pamięć w twoim systemie.

1

Powiedziałbym, że jesteś ograniczony tylko całkowitą ilością dostępnej pamięci RAM. Oczywiście im większa jest ta tablica, tym dłuższe operacje na niej zajmie.

+3

Zasadniczo prawdziwe, ale nie wszystkie z nich - dołączanie pozostaje niezmienne niezależnie od wielkości tablicy. – cdleary

+0

Interesujące, dzięki za komentarz. –

24

Pewnie, że jest OK. Właściwie można łatwo zobaczyć na własne oczy:

l = range(12000) 
l = sorted(l, reverse=True) 

Prowadzenie te linie na moim komputerze wzięli:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

Ale na pewno jak każdy inny powiedział. Im większa jest ta tablica, tym wolniejsze będą operacje.

+15

Czas w ten sposób może być mylący - przez większość czasu uruchamiany jest interpreter języka Python. Lepszym sposobem jest: python -m timeit.py "l = zasięg (12000); l = posortowany (l, reverse = True)". Na moim komputerze daje to około 1/20 czasu dla tego przykładu. –

+3

@dF, Masz rację co do dokładności. Dzięki za zwrócenie na to uwagi. Chciałem tylko udowodnić, o co chodzi. Dowodzi tego przykład. –

+8

@dF: Awesome! 0,024s było dla mnie o wiele za długie i cieszę się, że mogę przestać się tym martwić. –

6

W swobodnym kodzie utworzyłem listy zawierające miliony 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 wielkości listy.

Jeśli zależy Ci na wydajności, warto zajrzeć do biblioteki, takiej jak NumPy.

5

Performance characteristics for lists są opisane w Effbot.

Listy w języku Python są w rzeczywistości zaimplementowane jako wektor dla szybkiego dostępu losowego, więc kontener będzie w zasadzie przechowywać tyle elementów, ile jest w pamięci miejsca. (Potrzebne jest miejsce na wskaźniki znajdujące się na liście oraz miejsce w pamięci dla wskazanego obiektu (obiektów)).

Dołączanie to O(1) (amortyzowana stała złożoność), jednak wstawianie do/usuwanie ze środka sekwencja będzie wymagać ponownego uporządkowania O(n) (liniowa złożoność), która będzie wolniejsza niż liczba elementów na liście.

Twoje pytanie do sortowania jest bardziej dopracowane, ponieważ operacja porównywania może zająć nieograniczoną ilość czasu. Jeśli wykonujesz bardzo powolne porównania, to zajmie to dużo czasu, ale nie jest to żadna wina z Python's list data type.

Odwrócenie zajmuje tyle czasu, ile trzeba, aby zamienić wszystkie wskaźniki na liście (koniecznie O(n) (złożoność liniowa), ponieważ dotykasz każdego wskaźnika raz).

31

Jak Python documentation says:

sys.maxsize

Największą liczbą całkowitą dodatnią obsługiwane przez platformę typ Py_ssize_t, a tym samym maksymalne wymienia rozmiar, sznurki, dicts i wiele innych pojemniki mogą mieć.

w moim komputerze (Linux x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

jak ta odpowiedź na pytanie – ldgorman

+3

@ ldgorman, 'sys.maxsize' jest odpowiedzią na pytanie. Różne architektury obsługują różne maksima. –

+0

Czy wartość zwrócona przez sys.maxsize w jakikolwiek sposób odzwierciedla ilość dostępnej pamięci RAM komputera? – GeoJohn

-8

Nie ma ograniczeń numeru na liście. Głównym powodem powodującym błąd jest pamięć RAM. Podnieś swój rozmiar pamięci.

+1

-1, ponieważ w rzeczywistości nie odpowiada na pytanie i faktycznie wprowadza w błąd, ponieważ (jak pokazano w innych odpowiedziach) lista rzeczywiście ma największy rozmiar. –

Powiązane problemy