Существует множество вопросов и дискуссий о потреблении памяти различными типами данных Python. Тем не менее, немногие из них (если таковые имеются) приходят к очень конкретному сценарию. Если вы хотите хранить в памяти МНОГО данных ключ-значение, какая структура данных более эффективна с точки зрения памяти, словарь или список кортежей?
Вначале я думал, что dict более мощный, чем список кортежей, и эта сила должна иметь некоторую цену, и на самом деле пустой dict ДЕЙСТВИТЕЛЬНО занимает больше памяти, чем пустой список или кортеж (см. Размер структуры Python в памяти), поэтому я подумал, что использование [(key1, value1), (key2, value2), ...]
будет более эффективно с точки зрения памяти, чем {key1: value1, key2: value2, ...}
.
Похоже, я ошибался. Просто запустите следующий фрагмент кода и посмотрите, сколько памяти потребляет ваша ОС. Я использую Windows XP, поэтому диспетчер задач сообщает мне, что большой диктатор съедает «только» 40 МБ ОЗУ и 40 МБ ВИРТУРНОЙ ОЗУ, но список кортежей съедает 60 МБ ОЗУ и 60 МБ виртуального ОЗУ.
Как такое могло быть?
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")
Обновление:
Спасибо за некоторые комментарии ниже. Я хочу уточнить: я говорю об эффективности памяти. И нет, в этом случае не нужно беспокоиться об эффективности поиска значения ключа, давайте просто предположим, что мой алгоритм будет использовать их один за другим через итератор.