Это один из лучших вариантов использования генераторов: сохранение памяти.
Часто все, что вам нужно сделать, - это перебирать файлы, преобразовывать по одному и передавать поток в другое место.Скажем, например:
for f in files:
text = pdf_to_text(f)
output.write(text)
- тогда вам не нужно (или не нужно) понимание списка, фактически вам вообще не нужно создавать список.Вместо этого рассмотрите возможность перебора элементов по одному.Или создайте генератор, если это имеет больше смысла.
Имейте в виду, что сборщик мусора не может освободить память, если у вас все еще есть ссылка на нее.Если вы создаете представление списка, то все элементы в нем (и элементы, на которые эти элементы ссылаются) должны быть сохранены в памяти одновременно.Обычно это необходимо только в том случае, если вы планируете часто получать доступ к элементам или в нелинейном порядке.
Следует также учитывать возможность обработки больших файлов, даже если вы можете выполнить allocate
/ transform
/deallocate
все еще может быть "слишком медленным", если мы говорим о многих гигабайтах, которые стоит прочитать / записать.В этом случае лучшая альтернатива часто рассматривает возможность использования расширений C, которые обеспечат лучший контроль над тем, как распределяется и используется память.Кроме того, pypy
работает в подавляющем большинстве случаев и обычно намного быстрее, чем CPython.