我正在处理一个需要多次使用迭代器的任务。比如说
#data
fruit= ("grape", "banana", "apple")
#iterator
myit = iter(fruit)
#the function I have
def printIter(its):
for x in its:
print(x)
def printIter2(its):
for x in its:
print(x)
我必须在迭代器上调用printIter
两次,但它要执行完全不同的函数。但是迭代器只能使用一次。
我无法控制数据源fruit
和迭代器myit
。我只能控制函数printIter()
我怎样才能用更少的记忆达到我的目标
我目前拥有的:
it1, it2 = itertools.tee(its)
printIter(it1)
printIter(it2)
del it1, it2
这是一个很好的做法吗,还有其他方式吗
由于迭代器是有状态的,并且它的资源被消耗,所以我不确定两次使用同一个迭代器的目标是什么
但是,如果您不希望在使用
tee()
时同时拥有迭代器的两个副本的内存开销,您可以在第一个副本被使用和删除后重新声明迭代器由于您表示无法访问原始数据,
tee()
可能是迭代器的最佳选择。但是,您可以考虑将单个迭代器转换为列表,然后对其进行重复操作。如果您只有一个迭代器,并且需要在不消耗太多内存的情况下对其进行两种处理,那么最好的选择就是设计并行处理。也就是说,您需要能够一次处理一个项目的两个部分。在您的示例中,两个使用迭代器的函数都只是将其打印出来,这不利于并行化(您将以不同的顺序获得打印结果,例如
1, 1, 2, 2, 3, 3, ...
)。但对于其他类型的问题,很容易完成部分工作,然后等待更多数据下面是一个示例,我使用两个生成器函数并行使用
tee
的迭代器(使用内置的zip
)。一个将得到的值相加,只打印最终的和,另一个单独打印输出:
这类代码有很多微妙之处,因此,如果您在第一次尝试时没有让它工作,请不要感到惊讶。我上面的代码非常脆弱,因为
zip
并不是专门为管理这样的独立生成器而设计的相关问题 更多 >
编程相关推荐