Подтвердить что ты не робот

Использование памяти в словаре в Python?

Я немного смущен, когда использую метод getsizeof в модуле sys для словарей. Ниже я создал простой словарь из двух строк. Размеры двух строк явно больше, чем у словаря. Размер словаря, вероятно, является только служебным объемом словаря, т.е. Он не учитывает фактические данные. Каков наилучший способ выяснить использование памяти всего словаря (ключи, значения, служебные данные словаря)?

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140
4b9b3361

Ответ 1

Из PythonDocs

См. recursive sizeof recipe для примера использования метода getsizeof() рекурсивно, чтобы найти размер контейнеров и все их содержимое.

Таким образом, он учитывает только накладные расходы, но вы можете использовать функцию эту ссылку, чтобы вычислить ее для контейнеров, таких как dicts.

Ответ 2

Ну, словари не сохраняют в себе фактическую строку внутри, она немного похожа на указатели C/С++, поэтому вы получаете только постоянную служебную информацию в словаре для каждого элемента.

Общий размер

size = getsizeof(d)
size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys()))

Ответ 3

Рекурсивный getsizeof получит фактический размер, но если у вас есть несколько слоев словарей и вы хотите получить приблизительную оценку. json подходит.

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3049
>>> getsizeof(second)
3049
>>> getsizeof(my_dictionary)
288
>>> getsizeof(json.dumps(my_dictionary))
6076
>>> size = getsizeof(my_dictionary)
>>> size += sum(map(getsizeof, my_dictionary.values())) + sum(map(getsizeof, my_dictionary.keys()))
>>> size
6495