2009-11-05 36 views
8

Potrzebuję bardzo dużej listy, i próbuję dowiedzieć się, jak duże mogę to zrobić, aby nadal mieścił się w 1-2 GB pamięci RAM. Używam implementacji CPython na 64-bitowym (x86_64).Python: Ile miejsca zajmuje każdy element listy?

Edytuj: dzięki odpowiedzi bua wypełniłem niektóre z bardziej konkretnych odpowiedzi.

Czym jest przestrzeń (pamięć) wykorzystanie (w bajtach):

  • lista sama
    • sys.getsizeof([]) == 72
  • każdy wpis na liście (bez danych)
    • sys.getsizeof([0, 1, 2, 3]) == 104, czyli 8 bajtów powyżej głowa na wejście.
  • dane, jeżeli jest to liczba całkowita
    • sys.getsizeof(2**62) == 24 (ale zmienia się w zależności od całkowitej wielkości)
    • sys.getsizeof(2**63) == 40
    • sys.getsizeof(2**128) == 48
    • sys.getsizeof(2**256) == 66
  • danych, jeśli to jest obiekt (sizeof(Pyobject) Chyba))
    • sys.getsizeof(C()) == 72 (C jest pusta przestrzeń dla użytkownika obiektu)

Jeśli można udostępniać dane bardziej ogólnych o zaobserwowanych wielkości, to byłoby świetnie. Na przykład:

  • Czy są przypadki specjalne (myślę, że niezmienne wartości mogą być udostępniane, więc może lista elementów nie zajmuje więcej miejsca na dane)?
  • Być może małe listy pobierają X bajtów narzut, ale duże listy zajmują Y bajtów narzut?
+0

możesz chcieć odpowiedzieć na własne pytanie z dodanymi informacjami, jednak jest całkiem oczywiste, że bua odpowiedział na główną część pytania, a EOL dostarczył sposób dokładniejszego przewidywania i dopasowania większej liczby elementów do pamięci RAM. –

+0

Zostało to zaksięgowane jako odpowiedź, która musiała zostać usunięta jako odpowiedź typu Link Only, ale wydaje się, że może być przydatna, dlatego zamieszczam ją jako komentarz. Python Module of the Week napisał artykuł na temat zarządzania pamięcią w Pythonie, który można obejrzeć tutaj: http://pymotw.com/2/sys/limits.html – ArtOfWarfare

Odpowiedz

9

punkt start:

>>> import sys 
>>> a=list() 
>>> type(a) 
<type 'list'> 
>>> sys.getsizeof(a) 
36 
>>> b=1 
>>> type(b) 
<type 'int'> 
>>> sys.getsizeof(b) 
12 

iz pomocą Pythona:

>>> help(sys.getsizeof) 
Help on built-in function getsizeof in module sys: 

getsizeof(...) 
    getsizeof(object, default) -> int 

    Return the size of object in bytes. 
6

Jeśli chcesz wykazy wartości liczbowych, standardowy moduł array zapewnia zoptymalizowane tablic (które mają metody append).

Niestandardowy, ale powszechnie używany moduł NumPy zapewnia wydajne macierze o ustalonych rozmiarach.

+1

+1, dla modułu tablicowego –

Powiązane problemy