Python itertools tee,克隆和缓存

2024-09-30 00:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设:当使用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(可能会被部分使用)创建一个克隆)


Tags: 文件方法代码功能编辑副本性能where
1条回答
网友
1楼 · 发布于 2024-09-30 00:40:51

tee没有什么神奇的。它很聪明;-)在任何点,tee克隆传递给它的迭代器。这意味着克隆的迭代器将从的这一点生成由传入迭代器生成的值。但是他们不可能重现在调用tee之前产生的值。在

让我们用比你的例子简单得多的东西来说明:

>>> it = iter(range(5))
>>> next(it)
0

0现在消失了-永远。tee()无法取回:

^{pr2}$

因此a推动it生成下一个值。缓存的就是这个值,这样其他克隆也可以复制它:

>>> next(b)
1

为了得到这个结果,it没有被触碰-从内部缓存中检索了1。现在所有的ita和{}都产生了1,1也永远消失了。在

我不知道这是否回答了你的问题:“tee()知道我想要什么吗?”似乎需要心灵感应;—)也就是说,我不知道你说的“有适当的缓存”是什么意思。如果您给出一个您希望的输入/输出行为的确切示例,这将非常有帮助。在

除此之外,Python文档提供了相当于tee()的Python代码,研究这些代码也许可以回答您的问题:

def tee(iterable, n=2):
    it = iter(iterable)
    deques = [collections.deque() for i in range(n)]
    def gen(mydeque):
        while True:
            if not mydeque:             # when the local deque is empty
                newval = next(it)       # fetch a new value and
                for d in deques:        # load it to all the deques
                    d.append(newval)
            yield mydeque.popleft()
    return tuple(gen(d) for d in deques)

例如,您可以看到,关于迭代器内部状态的任何信息都没有被缓存—缓存的只是传入迭代器生成的值,从调用tee()开始。每个克隆都有它自己的deque(FIFO list)传入迭代器的值,这就是所有克隆知道的传入迭代器。所以对于你真正希望的事情来说,这可能太简单了。在

相关问题 更多 >

    热门问题