Словарь в Python: что, где, зачем | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
C++ Developer. Professional
-5%
Scala-разработчик
-8%
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Golang Developer. Professional
-5%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Microservice Architecture Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов React.js Developer Node.js Developer Интенсив «Оптимизация в Java» Супер-практикум по использованию и настройке GIT Symfony Framework Java Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Инфраструктурная платформа на основе Kubernetes
-6%
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Экcпресс-курс «ELK»
-10%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Базы данных Network engineer Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Словарь в Python: что, где, зачем

Python_Deep_17.12_site-5020-3cd240.png

Словарь в Python является фундаментальным типом хотя бы потому, что используется для хранения атрибутов объектов любого класса. Внутри словарь реализован как хеш-таблица с открытой адресацией, где коллизии разрешаются методом квадратичного пробинга, таблица расширяется при заполнении более чем на ⅔.

Вообще, словари достаточно хорошо описаны и стоят того, чтобы взглянуть на их исходники (искать в Objects/dictobject.c). Описанное устройство словарей несёт конкретные практические последствия:

Ключ должен быть хеширумым объектом Т. е. у него должен быть определен метод __hash__, возвращающий одинаковое значение во время жизни объекта. Кстати, если у вашего типа определён метод __eq__, то обязательно должен быть и __hash__, чтобы тип корректно работал со словарями и множествами.

Словари дают повышение накладных расходов по памяти Это связано с тем, что хеш-таблица должна быть достаточно большой для эффективной работы с ней. Если есть, например, необходимость сохранить в массиве большое количество записей, то оптимальнее по памяти представить их в виде кортежей, нежели чем в виде словарей.

Поиск по ключу очень быстрый Здесь тот самый space-time tradeoff, алгоритмическая сложность доступа O(1).

Порядок следования ключей зависит от порядка вставки в словарь Это связано с возникающими коллизиями. При этом словари с одинаковым содержимым равны при проверке через ==.

Модифицировать словарь, по которому итерируешься — плохая идея В определённый момент Python может решить, что пора ресайзить хеш-таблицу и тогда старые данные переедут в новую табличку с новыми коллизиями, может измениться порядок следования ключей.

Множества аналогично реализованы через хеш-таблицу, так что к ним применимы те же следствия.

Хотите узнать больше? Записывайтесь на курс «Разработчик Python» или задавайте вопросы в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
0

Почему бы не написать не только про плохие идеи но и про хорошие ?

Для комментирования необходимо авторизоваться