Использование памяти в словаре в 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
Ответы
Ответ 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