【问题标题】:Python: get number of items in generator without storing the itemsPython:获取生成器中的项目数而不存储项目
【发布时间】:2011-03-09 21:32:51
【问题描述】:
我有一个用于大量项目的生成器。我想遍历它们一次,将它们输出到文件中。但是,对于我目前拥有的文件格式,我首先必须输出我拥有的项目数。我不想在内存中建立一个项目列表,因为它们太多了,这将花费大量时间和内存。有没有办法遍历生成器,得到它的长度,但以后又能以某种方式再次遍历它,得到相同的项目?
如果没有,我还能想出什么其他解决方案来解决这个问题?
【问题讨论】:
标签:
python
memory
performance
generator
yield
【解决方案1】:
如果你能弄清楚如何编写一个公式来根据控制生成器的参数计算大小,那就去做吧。否则,我认为您不会节省太多时间。
在此处包含生成器,我们会尽力为您完成!
【解决方案2】:
这是无法做到的。一旦发电机用尽,就需要对其进行重建才能再次使用。如果事先知道项目的数量,则可以在迭代器对象上定义 __len__() 方法,然后可以针对迭代器对象调用 len()。
【解决方案3】:
我认为这对于任何通用迭代器都是不可能的。您将需要弄清楚生成器最初是如何构造的,然后重新生成它以进行最后的传递。
或者,您可以在文件中写出一个虚拟大小,写入项目,然后重新打开文件进行修改并更正标题中的大小。
如果您的文件是二进制格式,这可以很好地工作,因为无论实际大小是多少,大小的字节数都是相同的。如果它是文本格式,如果您无法填充虚拟大小以涵盖所有情况,则可能必须为文件添加一些额外的长度。有关使用 Python 在文本文件中插入和重写的讨论,请参阅 this question。