13

Коллекции в Python. Часть вторая

Серия Шпаргалки

Ссылка на первую часть.

Дисклеймер. На пиакбу нет редактора кода поэтому картинки. Поскольку это шпаргалка с примерами то в этом посте допустимо.

4. SimpleNamespace

Простой класс из модуля `types` для создания объектов с динамическими атрибутами. Доступ — через точку (`obj.attr`).

Полезен, когда нужен синтаксис `obj.name` без создания класса.

> 💡 Альтернатива словарю, когда удобнее писать `obj.name`, а не `obj['name']`.

5. Множества — `set`

Неупорядоченная коллекция уникальных элементов. Поддерживает операции: объединение, пересечение, разность.

Применяется для удаления дубликатов и проверки вхождения.

Создание: `{}` или `set()`

6. Неизменяемые множества — `frozenset`

Неизменяемая версия `set`. Можно использовать как ключ в словаре или элемент другого множества.

7. namedtuple — именованные кортежи

Неизменяемая структура с доступом по именам полей. Аналог кортежа, но читаемее.

> 💡 Отлично подходит для представления записей: точки, пользователи, конфиги — когда важна неизменяемость и читаемость.

8. deque — двусторонняя очередь

Оптимизирован для быстрых операций в начале и конце. Аналог списка, но эффективнее для `appendleft`, `popleft`.

> 💡 Используется в алгоритмах: BFS, кэширование (LRU), буферы, где важна производительность на концах.

9. Counter — счётчик элементов

Подсчитывает частоту элементов в итерируемом объекте. Удобен для статистики, анализа.

> 💡 Полезен для анализа текстов, логов, голосований — везде, где нужно посчитать, «что встречается чаще».

10. defaultdict — словарь со значениями по умолчанию

Автоматически создаёт значение по умолчанию при отсутствии ключа. Убирает необходимость проверок `if key in dict`.

> 💡 Убирает шаблонный код вида `if key not in d: d[key] = []`. Делает код чище и безопаснее.

11. dataclass — классы данных

Декоратор для автоматического создания классов с инициализатором, строковым представлением, сравнением и т.д.

> 💡 Заменяет ручное написание `__init__`, `__repr__`, `__eq__`. Идеален для DTO, конфигов, моделей.

12. UserList — кастомные списки

Наследуется от `collections.UserList`. Используется, чтобы создать список с переопределённым поведением.

> 💡 Полезен, когда нужно добавить логирование, валидацию, или изменить поведение стандартного списка.

13. UserDict — кастомные словари

Наследуется от `collections.UserDict`. Используется, чтобы создать словарь с переопределённым поведением.

> 💡 Используется для создания словарей с нормализацией ключей, валидацией, логированием, кешированием и т.п.

---

Сравнение коллекций по памяти и скорости

Выбор коллекции влияет на производительность и потребление памяти. Ниже — практические замеры для типичных сценариев.

1. Память: `list` vs `tuple` vs `array.array`

Создадим коллекции из 1 000 000 целых чисел и сравним размер в памяти.

> 💡 Вывод:
> - `array.array` экономит ~2x памяти для чисел.
> - `list` и `tuple` потребляют примерно одинаково, но `tuple` немного быстрее при итерации.

---

2. Скорость доступа: `list` vs `tuple` vs `array.array`

Замерим время доступа к каждому элементу в коллекции из 10 000 000 элементов.

> 💡 Вывод:
> - `array.array` — самый быстрый для чисел.
> - `tuple` быстрее `list` на 10–20%.
> - Разница заметна на больших объёмах.

3. Память: `dict` vs `SimpleNamespace` vs `dataclass`

Создадим объекты с 5 полями и сравним размер.

> 💡 Вывод:
> - `SimpleNamespace` и `dataclass` потребляют столько же памяти, сколько `dict`, потому что используют `__dict__`.
> - Если нужна экономия — используйте `__slots__` (см. ниже).

4. Экономия памяти: `dataclass` с `__slots__`

> 💡 Вывод:
> - `__slots__` экономит память и ускоряет доступ к атрибутам.
> - Цена — нельзя добавлять новые атрибуты динамически.

5. Скорость поиска: `list` vs `set`

Проверим, насколько быстрее `set` при проверке вхождения.

> 💡 Вывод:

> - `set` в тысячи раз быстрее `list` для проверки вхождения.

> - Всегда используй `set`, если нужно часто проверять `x in collection`.

6. Память: `set` vs `frozenset`

> 💡 Вывод:
> - `frozenset` и `set` потребляют одинаково.
> - Разница только в изменяемости.

7. Скорость добавления: `list.append` vs `deque.append` vs `deque.appendleft`

> 💡 Вывод:
> - `deque.appendleft` работает за O(1), в отличие от `list.insert(0)`, который O(n).
> - Для частых операций на обоих концах — только `deque`.

---

Общие рекомендации по производительности

Сравнение коллекций

> * — с Python 3.7+ словари, `defaultdict`, `UserDict`, `ChainMap` сохраняют порядок вставки.

---

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

Первая часть

Понравилось — ставь «+»
Полезно? Подпишись.
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Программирование на python

935 постов11.9K подписчиков

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества