Коллекции в 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, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу