Python: получите количество объектов в генераторе, не храня объекты

У меня есть генератор для большого набора объектов. Я хочу выполнить итерации через них однажды, производя их в файл. Однако с форматом файла я в настоящее время имею, я сначала должен произвести количество объектов, которые я имею. Я не хочу создавать список объектов в памяти, поскольку существуют слишком многие из них, и это заняло бы много времени и памяти. Существует ли способ выполнить итерации через генератор, получая его длину, но так или иначе смочь выполнить итерации через него снова позже, получая те же объекты?

В противном случае, что другое решение я мог придумать для этой проблемы?

5
задан Claudiu 29 June 2010 в 23:22
поделиться

3 ответа

Если вы можете придумать, как просто написать формулу для расчета размера на основе параметров, управляющих генератором, сделайте это. В противном случае я не думаю, что вы сэкономите много времени.

Включите генератор сюда, и мы постараемся сделать это за вас!

5
ответ дан 18 December 2019 в 11:52
поделиться

Я не думаю, что это возможно для любого обобщенного итератора.Вам нужно будет выяснить, как изначально был построен генератор, а затем регенерировать его для последнего прохода.

Как вариант, вы можете записать фиктивный размер в свой файл, записать элементы, а затем повторно открыть файл для модификации и исправить размер в заголовке.

Если ваш файл представляет собой двоичный формат, это может сработать достаточно хорошо, поскольку количество байтов для размера одинаково, независимо от фактического размера. Если это текстовый формат, возможно, вам придется добавить некоторую дополнительную длину к файлу, если вы не смогли дополнить фиктивный размер, чтобы охватить все случаи. См. этот вопрос для обсуждения вставки и перезаписи в текстовый файл с использованием Python.

5
ответ дан 18 December 2019 в 11:52
поделиться

Это невозможно. Когда генератор истощен, его необходимо реконструировать, чтобы использовать снова. Можно определить метод __ len __ () для объекта-итератора, если количество элементов известно заранее, а затем len () может быть вызван для объекта-итератора.

5
ответ дан 18 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: