Есть много вопросов и обсуждений о потреблении памяти разных типов данных python. Однако немногие из них (если таковые имеются) приходят к очень конкретному сценарию. Если вы хотите сохранить LOTS данных ключа в памяти, какая структура данных более эффективна с точки зрения памяти, dict или список кортежей?
В начале я думал, что dict более мощный, чем список кортежей, и что власть должна приходить с некоторой ценой, а на самом деле пустой dict DOES занимают больше памяти, чем пустой список или кортеж (см. Размер памяти в структуре Python), поэтому я подумал, что использование [(key1, value1), (key2, value2), ...]
будет более эффективным с точки зрения памяти, чем {key1: value1, key2: value2, ...}
.
Похоже, я ошибся. Просто запустите следующий фрагмент кода и просмотрите потребление памяти, указанное вашей ОС. Я использую Windows XP, чтобы диспетчер задач подсказывал мне, что большой диктат использует только "только" 40MB Ram и 40MB VIRTURAL Ram, но список кортежей питается 60MB Ram и 60MB Virtual ram.
Как это могло быть?
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 memory consumption now, press ENTER to exit")
Update:
Спасибо за некоторые из комментариев ниже. Я хочу уточнить: я говорю об эффективности памяти. И нет, в этом случае вам не нужно беспокоиться о эффективности поиска ключа-значения, просто предположим, что мой алгоритм будет потреблять их один за другим через итератор.