迭代器的性能优势?

kku*_*sik 20 python performance iterator

使用迭代器可以提供什么(如果有的话)性能优势.它似乎是解决许多问题的"正确方法",但是它是否会创建更快/更具记忆意识的代码?我在Python中专门思考,但不限制答案.

Jas*_*ker 24

在python邮件列表上实际上有一个非常好的邮件: Iterators vs Lists.它有点过时(从2003年开始),但据我所知,它仍然有效.

以下是摘要:

对于小型数据集,迭代器和基于列表的方法具有相似的性能.对于较大的数据集,迭代器可以节省时间和空间.

我将从中得出的是:如果可能的话,迭代器优先于将数据加载到列表中.但除非你有一个大的数据集,否则不要扭曲你的代码来制作一个适合列表的东西来处理迭代器.


Chr*_*tts 12

对于Python,生成器将更快,并具有更好的内存效率.想想一个range(1000) vs 的例子xrange(1000) (这已经在3.0中改变了,范围现在是一个生成器).使用Range,您可以预先构建列表,但XRange只有一个生成器对象,并在需要时生成下一个项目.

在小事情上,性能差异并不大,但是一旦你开始越来越多地获得越来越大的信息,你会很快注意到它.此外,不仅需要生成然后逐步执行,您将为预先构建的项目消耗额外的内存 - 与生成器表达式一样,一次只能生成1个项目.


Way*_*inn 7

迭代器的主要好处不是性能.根据我的经验,最高性能的解决方案是创建一个嵌入您选择的数据结构的算法.迭代器的好处是它们允许您解耦数据和算法,因此可以概括和重用两者.如果这也可以在没有(或很少)性能下降的情况下完成,那么它就是净增益.

我最喜欢的迭代器用法示例可以在C++ 标准模板库中找到.它通过在不牺牲性能的情况下干净地分离容器和算法来设法展示抽象的力量和美感.理解这种设计对我对代码的思考方式产生了深远的影响.


dam*_*ang 5

我认为有一个答案有点混淆了生成器和迭代器的概念。所以我决定尝试用一个比喻的例子来回答这个问题。

我在厨房工作,老板给我一项任务,将 10 个(或 100 个或 100 万个)面包的重量相加。我有一个秤和一个计算器(我的算法的魔术)。下面是可迭代对象、生成器、迭代器、方法的区别:

  1. 可迭代对象:每个面包都存储在一个盒子(内存)中,我称第一个(或第0个)面包的重量,放下它的重量,然后将面包放回盒子中,然后转到下一个,称重并放入最后,我得到了总重量,10 个(100 个或 100 万个)面包仍然在盒子里。

  2. 生成器:没有足够的盒子来存放所有这些面包,所以我请求面包师(生成器)的帮助,他做了第一个面包,给我,我称重,把结果记下来,扔掉那个面包离开并要求他再要一个,等等,直到我拿到最后一个面包(或者面包师可能没有面粉了)。最后的结果是,一个面包都没有了。但谁在乎呢,我的老板只让我称一下这些面包的重量,他没有说我不能扔掉它们(多么聪明的服务员啊)。

  3. 迭代器:我请某人(迭代器)帮我将第一个面包移到秤上,我称重,把结果记下来。这个人会去拿下一个进行测量,等等。我实际上不知道是否有人(迭代器)从盒子或面包师那里拿到面包。最终,我得到了总重量,这对我来说并不重要。

无论如何,总结一下:

  1. 可迭代对象开始时需要一些内存来存储数据。最终,数据仍然存在。

  2. 生成器不需要内存来存储数据,它会动态生成数据。

  3. 迭代器是算法与其数据之间的通道。该数据可能已经存在并存储在存储器中,或者可以由生成器实时生成。在第一种情况下,随着迭代器不断迭代,该内存将被一点一点地释放。所以我非常同意上面的答案,迭代器是好的,因为它的抽象可以实现算法和数据的隔离。

python 并不完全像这样工作。希望它有助于澄清一点。