Пользовался ли библиотекой itertools в Python
Что проверяют
Работаете ли вы с данными лениво или всё превращаете в списки. itertools это проверка понимания итераторов: что они одноразовые, что не держат данные в памяти и что готовая функция из стандартной библиотеки обычно быстрее ручного цикла, потому что цикл внутри неё крутится не на Python.
Как отвечать
Скажите, что берёте и под какую задачу:
- склейка источников:
chainиchain.from_iterableвместо конкатенации списков; - нарезка:
isliceберёт кусок без материализации,teeкогда поток нужно прочитать дважды,batchedдля разбиения на пачки в свежих версиях языка; - группировка:
groupbyпо ключу, только по заранее отсортированным данным; - фильтры:
takewhile,dropwhile,filterfalse,compress; - комбинаторика:
product,permutations,combinations,combinations_with_replacement; - бесконечное:
count,cycle,repeat, всегда в паре с ограничителем; - накопление:
accumulateдля нарастающих сумм и произвольной функции.
from itertools import groupby, islice
rows.sort(key=lambda r: r["dept"])
for dept, group in groupby(rows, key=lambda r: r["dept"]):
print(dept, sum(r["salary"] for r in group))
head = list(islice(read_huge_log(), 100)) # файл не читается целикомХороший ответ заканчивается границей применимости: когда цепочка из трёх вложенных вызовов читается хуже обычного цикла, берут цикл.
Где спотыкаются
Зовут groupby без сортировки. Он режет поток по соседним одинаковым ключам, поэтому на неупорядоченных данных одна и та же группа появится несколько раз, и никакой ошибки при этом не будет: результат просто тихо неверный.
Второе: забывают, что итератор одноразовый. Группа из groupby живёт только до перехода к следующей, и сохранённая в список групп ссылка окажется пустой. Если группу надо использовать позже, её материализуют сразу, а для двойного прохода берут tee или список.
Третье: недооценивают комбинаторный взрыв. list(permutations(items)) на двух десятках элементов не помещается никуда, и это не вина библиотеки. Комбинаторные функции возвращают ленивые итераторы как раз затем, чтобы их можно было обрезать islice или отфильтровать на лету.