2010-06-29 23 views
5

J'ai un générateur pour un grand nombre d'articles. Je veux les parcourir une fois, les sortir dans un fichier. Cependant, avec le format de fichier que j'ai actuellement, je dois d'abord afficher le nombre d'éléments que j'ai. Je ne veux pas créer une liste des éléments en mémoire, car ils sont trop nombreux et cela prendrait beaucoup de temps et de mémoire. Y a-t-il un moyen de parcourir le générateur, d'obtenir sa longueur, mais d'une façon ou d'une autre de pouvoir le parcourir plus tard, en obtenant les mêmes éléments?Python: obtenir le nombre d'éléments dans le générateur sans stocker les éléments

Sinon, quelle autre solution pourrais-je trouver pour ce problème?

Répondre

5

Si vous pouvez comprendre comment écrire juste une formule pour calculer la taille en fonction des paramètres qui contrôlent le générateur, le faire. Sinon, je ne pense pas que vous économiseriez beaucoup de temps.

Inclure le générateur ici, et nous allons essayer de le faire pour vous!

+0

ah oui j'ai realizd cela peu de temps après j'ai posté =) – Claudiu

5

Cela ne peut pas être fait. Une fois qu'un générateur est épuisé, il doit être reconstruit pour pouvoir être réutilisé. Il est possible de définir la méthode __len__() sur un objet itérateur si le nombre d'éléments est connu à l'avance, puis len() peut être appelée par rapport à l'objet itérateur.

5

Je ne pense pas qu'il est possible pour une iterator généralisée. Vous aurez besoin de comprendre comment le générateur a été construit à l'origine et ensuite le régénérer pour la dernière passe.

Sinon, vous pouvez écrire une taille factice à votre fichier, écrire les articles, puis rouvrir le dossier de modification et de corriger la taille dans l'en-tête.

Si votre fichier est un format binaire, cela pourrait fonctionner assez bien, puisque le nombre d'octets pour la taille est la même quelle que soit la taille réelle est. S'il s'agit d'un format texte, il est possible que vous deviez ajouter une longueur supplémentaire au fichier si vous n'étiez pas en mesure de remplir la taille factice pour couvrir tous les cas. Voir this question pour une discussion sur l'insertion et la réécriture dans un fichier texte en utilisant Python.