假设:当使用pythonitertools.tee()
时,所有重复的迭代器都引用原始迭代器,原始迭代器被缓存以提高性能。在
在下面的查询中,我主要关心的是我对预期的/适当的缓存行为的想法。
编辑:我的正确缓存的想法是基于有缺陷的功能假设。最终需要一个小的包装器来包装tee(这可能会对缓存产生影响)。在
假设我使用tee:a, b, c = itertools.tee(myiter,3)
创建3个迭代器克隆。还假设此时,我删除了对原始文件myiter
的所有引用(这意味着,我的代码在以后没有很好的方法来引用原始代码)。在
在稍后的代码中,如果我决定要另一个myiter
的克隆,我可以重新-tee()我的一个副本吗?{cd3>原来缓存到正确的}(缓存回正确的^)
换言之,在后来的某个时候,我希望我用这个来代替:
a, b, c, d = itertools.tee(myiter,4)
。
但是,由于我已经放弃了对原始myiter
的所有引用,所以我能找到的最好的方法是:
copytee = itertools.tee(a, 1) #where 'a' is from a previous tee()
tee()知道我想要什么吗?(我真的想基于原始的myiter
,而不是中间的克隆a
(可能会被部分使用)创建一个克隆)
tee
没有什么神奇的。它很聪明;-)在任何点,tee
克隆传递给它的迭代器。这意味着克隆的迭代器将从的这一点生成由传入迭代器生成的值。但是他们不可能重现在调用tee
之前产生的值。在让我们用比你的例子简单得多的东西来说明:
0现在消失了-永远。
^{pr2}$tee()
无法取回:因此
a
推动it
生成下一个值。缓存的就是这个值,这样其他克隆也可以复制它:为了得到这个结果,}都产生了1,1也永远消失了。在
it
没有被触碰-从内部缓存中检索了1。现在所有的it
、a
和{我不知道这是否回答了你的问题:“tee()知道我想要什么吗?”似乎需要心灵感应;—)也就是说,我不知道你说的“有适当的缓存”是什么意思。如果您给出一个您希望的输入/输出行为的确切示例,这将非常有帮助。在
除此之外,Python文档提供了相当于tee()的Python代码,研究这些代码也许可以回答您的问题:
例如,您可以看到,关于迭代器内部状态的任何信息都没有被缓存—缓存的只是传入迭代器生成的值,从调用
tee()
开始。每个克隆都有它自己的deque
(FIFO list)传入迭代器的值,这就是所有克隆知道的传入迭代器。所以对于你真正希望的事情来说,这可能太简单了。在相关问题 更多 >
编程相关推荐