擅长:python、mysql、java
<p>这样做的目的基本上只是为了在Cython/C代码中更高效地分配内存。例如,假设Cython模块公开了一个函数,该函数接受自定义<code>MyNetworkConnection()</code>对象的iterable,并且在内部需要为数据结构创建和分配内存,以便在Cython/C代码中表示它们。如果我们能粗略估计迭代器中的项目数,我们就可以在一次操作中分配足够大的内存板,以最小的调整大小来容纳所有这些项目。在</p>
<p>如果实现了<code>__len__()</code>,我们就知道确切的长度,并可以将其用于内存分配。但通常情况下,我们并不知道确切的长度,所以这个估计值通过给我们一个“大概的数字”来帮助我们提高性能。在</p>
<p>它在纯Python代码中当然也很有用,例如,可能是一个面向用户的操作完成时间估计?在</p>
<p>对于问题2,好吧,这是一个暗示,所以你不能指望它是准确的。如果提示太低,您仍必须考虑分配新内存,如果提示太高,则必须清理内存。我个人没有意识到其他限制或潜在的问题。在</p>
<p>对于问题3,我看不出它为什么不适用于生成器,因为生成器<em>是迭代器</em>:</p>
<pre><code>>>> import collections
>>> def my_generator(): yield
>>> gen = my_generator()
>>> isinstance(gen, collections.Iterator)
True
</code></pre>