Мастерство стандартной библиотеки python: itertools.chain
Представьте, что вам нужно пробежать за один проход по N коллекциям, например по двум вот таким.
Естественно, возникает желание написать вот такой цикл:
Проблема с этим решением в том, что вы создаете новый лист, и его длина равна сумме длин исходных листов. Если вы знаете, что они оба маленькие, то это, скорее всего, ничего, но представьте, что каждый весит в памяти по 1 Гб. В пике ваша программа съест в 2 раза больше памяти, чем весят ваши исходные листы. И легко может вообще не выполниться, если на машине не хватит RAM.
На самом деле, мы хотим сделать что-то вроде такого:
То есть не делать новых листов и ничего не копировать - а пробежать по ним по очереди, но через один итератор.
И это именно то, что делает itertools.chain
У чейна есть вторая форма, itertools.chain.from_iterable
. Это абсолютно тоже самое, но с немного другим интерфейсом.
То есть, в общем виде:
Стоило ли делать 2 чейна, отличающихся на анпэкинг аргументов? Не знаю, не мне судить авторов itertools, они боги. Но я знаю, что нет нужды плодить сущности без необходимости. А это возвращает нас к теме создания лишних новых листов и вообще лишних объектов.
Это я к чему?
Берегите ресурсы. Кажется, все уже давно не так и в наш век ресурсов сколько угодно, но после первого инвойса из Google Cloud Functions (где вы платите за использованные циклы CPU и мегабайто-часы съеденной памяти) уверен, Вы передумаете. Да и сам по себе питон не слишком экономичен - не стоит ему еще дополнительно помогать.