什么情况下__length_hint__会变得不准确?

4

我知道,在没有实际迭代的情况下,你无法确定Python迭代器的长度。

__length_hint__方法即it.__length_hint__()会返回len(list(it))估计值。甚至在操作员模块中有一个包装此方法的函数,该方法表示该方法“可能高估或低估任意数量。”

对于有限迭代器,什么情况下__length_hint__将不准确?如果不能确定,为什么?

我在PEP 424中没有看到相关引用。

>>> obja = iter(range(98345984))
>>> obja.__length_hint__()
98345984

>>> import numpy as np
>>> objb = iter(np.arange(817483))
>>> objb.__length_hint__()
817483

我知道依赖于实现细节并不是个好主意。但这个细节已经在操作符模块的顶层函数中显式使用了。例如,是否有特定的数据结构不会产生可能的不准确性?


1
不是的,这个评论只是在说提示长度可以比终极长度更长,也可以比终极长度更短。换句话说,它没有做出任何承诺;提示可能是正确的,但也可能不是。 - chepner
假设您有一个函数,它会遍历列表,直到找到所需的内容。您知道迭代值的数量将在1和N之间,因此您可以猜测例如N/2,但您不知道实际长度是多少... - zvone
1
这是一个有趣的问题。我的答案是:PEP 424 对于这个潜在有用的方法来说是错误的路径。它应该是1)一个大于等于0的数字,意味着不仅长度可用和可靠,而且它(返回值)存在;或者2)-1表示没有长度可用。 - dawg
1个回答

1
基本上,任何迭代动态生成的内容而不是迭代已完成序列的东西都属于这种情况。
考虑一个简单的迭代器,它会掷硬币,正面值1分,反面值2分。它将继续掷硬币,直到达到4分为止。
def coinflip():
    s = 0
    while s < 4:
       x = random.choice([1,2])
       s += x
       yield ("H" if x == 1 else "T")

这个序列会有多长?可能只有2:TT。也可能有4个:要么是HHHH,要么是HHHT。然而,在大多数情况下,它将是3:HHTHTHHTTTHTTHH。在这种情况下,3将是“最安全”的猜测,但实际长度可能会更长或更短。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接