Если вы работали с Python 2 или ранней версией Python 3, вы, вероятно, помните, что раньше словари не упорядочивались. Если вы хотите иметь словарь, который сохранял бы порядок вставки, лучшим решением было бы использовать OrderedDict из модуля коллекций.

В Python 3.6 словари были переработаны для повышения их производительности (использование ими памяти было уменьшено примерно на 20–25%). Это изменение имело интересный побочный эффект - словари стали упорядоченными (хотя этот порядок официально не гарантировался). Официально не гарантировано означает, что это всего лишь деталь реализации, которая может быть удалена в будущих выпусках Python.

Но начиная с Python 3.7 сохранение порядка вставки гарантировано в спецификации языка. Если вы начали свое путешествие с Python 3.7 или более новой версии, вы, вероятно, не знаете, где вам нужна отдельная структура данных для сохранения порядка вставки в словаре.

Итак, если нет необходимости использовать OrderedDict, почему он все еще включен в модуль коллекций? Может так эффективнее? Давайте разберемся!

OrderedDict против dict

Для своих тестов я выполню несколько типичных операций со словарем:

  1. Создать словарь из 100 элементов
  2. Добавить новый элемент
  3. Проверить, существует ли элемент в словаре
  4. Захватите существующий и несуществующий элемент с помощью метода get

Чтобы упростить код, я оборачиваю шаги 2–4 в функцию, которая принимает словарь (или OrderedDictionary) в качестве аргумента.

Сравним обе функции. Я провожу тесты под Python 3.8:

OrderedDict более чем на 80% медленнее, чем стандартный словарь Python (8,6 / 4,7≈1,83).

Что будет, если размер словаря вырастет до 10 000 элементов?

После увеличения размера словаря в 100 раз разница между обеими функциями остается прежней. OrderedDict по-прежнему занимает почти вдвое больше времени для выполнения тех же операций, что и стандартный словарь Python.

Даже большие словари нет смысла тестировать. Если вам нужен действительно большой словарь, вам следует использовать более эффективные структуры данных из библиотек Numpy или Pandas.

Когда использовать OrderedDict?

Если OrderedDict работает медленнее, зачем вам его использовать? Я могу придумать как минимум две причины:

  • Вы по-прежнему используете версию Python, которая не гарантирует порядок в словарях (до 3.6). В этом случае у вас нет выбора.
  • Вы хотите использовать дополнительные функции, которые предлагает OrderedDict. Например, его можно перевернуть. Если вы попытаетесь запустить функцию reversed () в стандартном словаре, вы получите сообщение об ошибке, но OrderedDict прекрасно вернет обратную версию самого себя.

Как быть в курсе изменений Python?

Если вы используете одну из последних версий Python, словари упорядочены по умолчанию. Но легко пропустить подобные изменения, особенно если вы обновляете версию Python сразу несколькими выпусками и не читаете внимательно примечания к выпуску. Я обычно читаю некоторые сообщения в блогах, когда выходит новая версия Python (в это время появляется множество сообщений в блогах), поэтому я ловлю важные обновления.

Лучший источник информации - официальная документация. В отличие от большого количества документации, которую я видел в своей жизни, страница Что нового в Python 3 написана на очень доступном языке. Легко прочитать и понять самые важные изменения. Если вы еще этого не сделали, попробуйте сами. Я перечитал его несколько дней назад и был удивлен, сколько функций я забыл!

Первоначально опубликовано по адресу https://switowski.com/blog/ordered- dictionaries.