2010-06-29 4 views
5

Ho un generatore per una vasta serie di articoli. Voglio scorrere una volta su di loro una volta, trasferendole in un file. Tuttavia, con il formato di file che ho attualmente, devo prima restituire il numero di elementi che ho. Non voglio creare un elenco degli elementi in memoria, poiché ce ne sono troppi e ci vorrebbe molto tempo e molta memoria. C'è un modo per iterare attraverso il generatore, ottenendo la sua lunghezza, ma in qualche modo essere in grado di scorrere nuovamente in seguito, ottenendo gli stessi elementi?Python: ottieni il numero di elementi nel generatore senza memorizzare gli articoli

In caso contrario, quale altra soluzione potrei ottenere per questo problema?

risposta

5

Se riesci a capire come scrivere una formula per calcolare le dimensioni in base ai parametri che controllano il generatore, fallo. Altrimenti, non penso che risparmierai molto tempo.

Includi il generatore qui e proveremo a farlo per te!

+0

ah, sì, mi rendo conto di questo subito dopo ho postato =) – Claudiu

5

Questo non può essere fatto. Una volta che un generatore è esaurito, deve essere ricostruito per poter essere riutilizzato. È possibile definire il metodo __len__() su un oggetto iteratore se il numero di elementi è noto in anticipo e quindi len() può essere chiamato contro l'oggetto iteratore.

5

Non penso che sia possibile per qualsiasi iteratore generalizzato. Dovrai capire come è stato originariamente costruito il generatore e poi rigenerarlo per il passaggio finale.

In alternativa, è possibile scrivere una dimensione fittizia sul file, scrivere gli elementi, quindi riaprire il file per la modifica e correggere la dimensione nell'intestazione.

Se il file è un formato binario, questo potrebbe funzionare abbastanza bene, poiché il numero di byte per la dimensione è lo stesso indipendentemente dalla dimensione effettiva. Se si tratta di un formato di testo, è possibile che si debba aggiungere una lunghezza extra al file se non si è in grado di riempire la dimensione fittizia per coprire tutti i casi. Vedi this question per una discussione sull'inserimento e riscrittura in un file di testo usando Python.