Какие инструменты itertools стоит знать?
- Как обработать большой поток данных в Python без загрузки в память?
Ленивые строительные блоки: chain (склеить), islice (срез итератора), groupby (группы подряд идущих — нужна предварительная сортировка), product/permutations/combinations, accumulate (накопительные суммы), batched (3.12, пачки по n), tee, zip_longest, count/cycle/repeat.
- Всё лениво: работает с бесконечными и огромными потоками
- groupby без сортировки разобьёт одинаковые ключи на несколько групп
- Итератор одноразовый: после прохода пуст
А ещё more-itertools — расширенный набор (chunked, windowed, first)
Подробно
Зачем. Итераторы обрабатывают элементы по одному, не создавая промежуточных списков: файл на 10 ГБ читается построчно с постоянной памятью.
Частые ловушки:
groupbyгруппирует только соседние элементы с одинаковым ключом;- группа — итератор, который «исчезает» при переходе к следующей — материализовать
list(group), если нужна позже; teeхранит буфер разницы между копиями — при сильном расхождении съедает память;- повторный обход исчерпанного итератора молча ничего не даёт.
batched (3.12) — частая задача «отправлять в БД пачками»; в старых версиях — islice в цикле или more_itertools.chunked.
Пример
from itertools import islice, groupby, batched, chain
with open("big.log") as f:
first_100 = list(islice(f, 100))
rows = sorted(orders, key=lambda o: o.city)
for city, group in groupby(rows, key=lambda o: o.city):
print(city, sum(o.total for o in group))
for chunk in batched(ids, 500): # Python 3.12
db.fetch_many(chunk)Что хотят услышать
- Основные функции и ленивость.
- Ловушка groupby.
- Применение к большим данным.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Функции itertools ленивые, а groupby сам собирает все одинаковые ключи, даже если они идут не подряд
- ✗chain создаёт новый список из всех элементов сразу
- ✓Функции itertools ленивые; groupby объединяет только подряд идущие ключи — данные сортируют заранее
- ✗islice поддерживает отрицательные индексы
Разбор темы
- Итераторы, генераторы и itertools
Протокол итерации, генераторы и генераторные выражения, срезы, send и yield from, ленивые инструменты itertools.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.