Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jigi-33/89e7814f37be612ea9fc0dea979c5431 to your computer and use it in GitHub Desktop.
Save jigi-33/89e7814f37be612ea9fc0dea979c5431 to your computer and use it in GitHub Desktop.
Продвинутые структуры данных Python3 - тезисы из книги Д. Бейдера

В каких случаях разумно использование тех или иных продвинутых структур данных Python

(тезисы из книги Дэна Бейдера "Чистый Питон" / "Python Tricks") :

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

Именованные кортежи помогут почистить ваш исходный код, обеспечив данным более доступную для понимания структуру.

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

Специализированные реализации словарей с доступом только для чтения (types.MappingProxyType - обертка для создания словарей только для чтения, или можно для этих целей снова применить namedtuple), упорядоченные словари (OrderedDict) или цепочки словарей (ChainMap) с поиском как по словарю, также весьма применимы в нестандартных случаях.

• Нужно хранить произвольные объекты, которые потенциально могут иметь смешанные типы данных? Используйте обычный список(list) или кортеж(tuple) в зависимости от того, хотите вы иметь неизменяемую структуру данных или нет.

• Преобладают числовые (целочисленные или с плавающей точкой) данные и важны плотная упаковка и производительность? Попробуйте array.array.

• Имеются текстовые данные, представленные символами Юникода? Используйте встроенный в Python тип str. Если вам нужна "изменяемая последовательность символов", то используйте list как список символов.

• Нужно хранить нефрагментированный блок байтов? Используйте неизменяемый тип bytes, либо bytearray, если вам нужна изменяемая структура данных.

Рекомендации касаемо объектов данных:

• Если у нас есть всего несколько (2–3) полей: использование обыкновенного кортежа (tuple) может быть оптимальным, если порядок следования полей легко запоминается или имена полей излишни.

• Когда у нас неизменяемые поля - обыкновенные кортежи, collections.namedtuple и typing.NamedTuple дадут неплохие возможности для реализации этого типа объекта данных.

• Нужно устранить имена полей, чтобы избежать опечаток: вашими помощниками здесь вновь будут collections.namedtuple и typing.NamedTuple.

Общий "универсальный" вариант структуры данных:

• Если ищем наиболее безопасный вариант, который можно использоваться по умолчанию, то общая рекомендация в отношении реализации простой записи, структуры или объекта данных в Python3 будет следующей: использовать collections.namedtuple или его младшего брата typing.NamedTuple (усовершенствованные именованные кортежи, доступные начиная с версии 3.6).

• Если нужы объекты с изменяемой структурой и совсем не хочется усложнять: обыкновенный словарь (dict) будет хорошим вариантом из-за удобного привычного синтаксиса. Либо, как продвинутый вариант - **OrderedDict ** или даже цепочка ChainMap из модуля collections.

Дополнительно по множествам и счетчику:

Множество (set) является еще одной полезной и широко используемой структурой данных, включенной в SPL. Когда нужно получить изменяемое множество, используем тип set.

А вот **frozensets **не изменяемы. Объекты frozenset хешируемы и могут использоваться в качестве "закрытого" словаря или ключей множества.

В завершении, про счетчик! Класс collections.Counter реализует структуру данных "мультимножество", который допускает неоднократное появление элемента во множестве. Он бывает полезен, если нам нужно вести учет не только того, принадлежит ли элемент множеству, но и того, сколько раз он был включен во множество.


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment