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个项目.
我认为有一个答案有点混淆了生成器和迭代器的概念。所以我决定尝试用一个比喻的例子来回答这个问题。
我在厨房工作,老板给我一项任务,将 10 个(或 100 个或 100 万个)面包的重量相加。我有一个秤和一个计算器(我的算法的魔术)。下面是可迭代对象、生成器、迭代器、方法的区别:
可迭代对象:每个面包都存储在一个盒子(内存)中,我称第一个(或第0个)面包的重量,放下它的重量,然后将面包放回盒子中,然后转到下一个,称重并放入最后,我得到了总重量,10 个(100 个或 100 万个)面包仍然在盒子里。
生成器:没有足够的盒子来存放所有这些面包,所以我请求面包师(生成器)的帮助,他做了第一个面包,给我,我称重,把结果记下来,扔掉那个面包离开并要求他再要一个,等等,直到我拿到最后一个面包(或者面包师可能没有面粉了)。最后的结果是,一个面包都没有了。但谁在乎呢,我的老板只让我称一下这些面包的重量,他没有说我不能扔掉它们(多么聪明的服务员啊)。
迭代器:我请某人(迭代器)帮我将第一个面包移到秤上,我称重,把结果记下来。这个人会去拿下一个进行测量,等等。我实际上不知道是否有人(迭代器)从盒子或面包师那里拿到面包。最终,我得到了总重量,这对我来说并不重要。
无论如何,总结一下:
可迭代对象开始时需要一些内存来存储数据。最终,数据仍然存在。
生成器不需要内存来存储数据,它会动态生成数据。
迭代器是算法与其数据之间的通道。该数据可能已经存在并存储在存储器中,或者可以由生成器实时生成。在第一种情况下,随着迭代器不断迭代,该内存将被一点一点地释放。所以我非常同意上面的答案,迭代器是好的,因为它的抽象可以实现算法和数据的隔离。
python 并不完全像这样工作。希望它有助于澄清一点。
归档时间: |
|
查看次数: |
12758 次 |
最近记录: |