Istnieje wiele pytań i dyskusji na temat zużycia pamięci różnych typów danych Pythona. Jednak niewielu z nich (jeśli takie istnieją) doszło do bardzo konkretnego scenariusza. Jeśli chcesz przechowywać WIELKIE dane klucz-wartość w pamięci, która struktura danych jest bardziej wydajna pod względem pamięci, dykta lub lista krotek?Zużycie pamięci Pythona: dict Lista krotek VS
Na początku myślałem, że dict jest silniejszy niż lista krotek i ta moc musi pochodzić z pewną ceną, a właściwie pusty dykta zajmuje więcej pamięci niż pusta lista lub krotka (patrz In-memory size of a Python structure), więc pomyślałem, że przy użyciu [(key1, value1), (key2, value2), ...]
byłaby bardziej wydajna pod względem pamięci niż {key1: value1, key2: value2, ...}
.
Wygląda na to, że się myliłem. Po prostu uruchom poniższy fragment kodu i zobacz zużycie pamięci zgłoszone przez Twój system operacyjny. Używam systemu Windows XP, więc menedżer zadań mówi mi, że duży dyktuje "tylko" 40MB pamięci RAM i 40MB VIRTURAL RAM, ale lista krotek pożera 60MB RAM i 60MB Virtual RAM.
Jak to możliwe?
from sys import getsizeof as g
raw_input('ready, press ENTER')
i = 1000000
#p = [(x, x) for x in xrange(i)] # Will print 4,348,736 40,348,736
p = dict((x, x) for x in xrange(i)) # Will print 25,165,964 37,165,964
print g(p), g(p) + sum(g(x) for x in p)
raw_input("Check your process's memory consumption now, press ENTER to exit")
Aktualizacja:
Dzięki dla niektórych komentarzach poniżej. Chcę wyjaśnić: mówię o wydajności pamięci. I nie, w tym przypadku nie trzeba się martwić o skuteczność wyszukiwania wartości klucz-wartość, załóżmy, że mój algorytm pochłonie je jeden po drugim za pomocą iteratora.
Zadajesz niewłaściwe pytanie. Jeśli potrzebujesz podglądu par klucz-wartość, to idź z Dictem. Jeśli potrzebujesz tablicy, użyj listy lub krotki. –
Python przechowuje tabelę skrótów dla słowników. [Ten link] (http://mail.python.org/pipermail/python-list/2000-March/048085.html) pochodzi z [inna odpowiedź] (http://stackoverflow.com/questions/114830/is- a-python-słownik-przykład-z-hash-tabeli) Myślę, że te słowniki są szybsze dla wyszukiwań, a krotki zużywają mniej pamięci. – mbowden
W przypadku niektórych rodzajów danych można użyć czegoś bardziej optymalnego niż obie opcje, np. Tria. – wRAR