Рубрики
Без рубрики

Python: Получить размер словаря

В этой статье вы узнаете, как получить размер словаря Python по длине пар ключ-значение и по размеру в байтах, с примерами.

Автор оригинала: Sathiya Sarathi Gunasekaran.

Python: Получить размер словаря

Вступление

В этой статье мы рассмотрим как найти размер словаря в Python .

Размер словаря может означать его длину или место, которое он занимает в памяти. Чтобы найти количество элементов, хранящихся в словаре, мы можем использовать функцию len () .

Чтобы найти размер словаря в байтах, мы можем использовать функцию getsizeof() модуля sys .

Для подсчета элементов вложенного словаря можно использовать рекурсивную функцию.

Поиск размера словаря

Функция len() широко используется для определения размера объектов в Python. В нашем случае передача объекта словаря этой функции вернет размер словаря, то есть количество пар ключ-значение, присутствующих в словаре.

Поскольку эти объекты отслеживают свою длину, эта операция имеет временную сложность O(1):

my_dict = {1: "a", 2: "b"}
print("The length of the dictionary is {}".format(len(my_dict)))

Приведенный выше фрагмент возвращает этот вывод:

The length of the dictionary is 2

Поиск размера словаря в байтах

Размер памяти объекта словаря в байтах может быть определен функцией getsizeof () . Эта функция доступна из модуля sys . Как и len() , он может быть использован для поиска размера любого объекта Python.

Это особенно полезно, когда нам нужен код, который должен быть производительным и/или требует регулярного мониторинга. Давайте возьмем наш предыдущий пример и получим размер словаря в байтах вместо количества элементов:

import sys

my_dict = {1: "a", 2: "b"}
print("The size of the dictionary is {} bytes".format(sys.getsizeof(my_dict)))

В результате получается:

The size of the dictionary is 232 bytes

Поиск размера вложенных словарей

Вложенный словарь-это словарь внутри словаря или словарь с несколькими уровнями пар ключ-значение. Эти вложенные словари помогают упростить сложные структуры, такие как ответы JSON из API.

Они выглядят примерно так:

{"dict1": {"dict2": "value 1"}}

Использование функции lens() для получения количества всех пар ключ-значение не будет работать, так как она дает размер объекта только для первого уровня ключей. Чтобы найти количество всех вложенных ключей, мы можем написать пользовательскую рекурсивную функцию для подсчета ключей. Эта функция будет принимать словарь и счетчик в качестве аргументов и перебирать каждый ключ.

Для каждой итерации функция проверяет, является ли экземпляр рассматриваемого ключа словарем. Если это правда, то функция рекурсивно вызывается снова, добавляя переменную counter к counter+1 и передавая вычисляемый словарь в качестве аргументов.

Эта рекурсивная функция существует на полной итерации, возвращая длину словаря в виде переменной: counter .

Если ключ не является экземпляром словаря, то счетчик просто добавляется к counter+1 . Функция возвращает значение counter в результате итерации, которая дает размер вычисляемого словаря.

Следовательно, количество вложенных ключей вычисляется с помощью этой функции, как показано ниже:

def count_keys(dict_, counter=0):
    for each_key in dict_:
        if isinstance(dict_[each_key], dict):
            # Recursive call
            counter = count_keys(dict_[each_key], counter + 1)
        else:
            counter += 1
    return counter

my_dict = {
       'Name':
           {
               'first_name': 'Sherlock',
               'Last_name': 'Holmes'
           },
       'Locality':
           {
           'Address':
               {
                   'Street': '221B Baker Street'
               },
           'City': 'London',
           'Country': 'United Kingdom'
           }
      }

print('The length of the nested dictionary is {}'.format(count_keys(my_dict)))

И когда сниппет выполняется, мы получаем следующий вывод, соответствующий количеству ключей, присутствующих в словаре:

The length of the nested dictionary is 8

Вывод

В этой статье мы рассмотрели методы расчета размера и длины словарей и вложенных словарей.

Эти функции могут быть очень полезны при обслуживании объектов JSON через API: веб-серверы накладывают ограничения на размер объектов JSON, обслуживаемых через API, и эти функции можно использовать для контроля длины и размера.