python 中的枚举是懒惰的吗?
我想知道当我将生成器函数的结果传递给 python 的 enumerate() 时会发生什么。示例:
def veryBigHello():
i = 0
while i < 10000000:
i += 1
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word
枚举是惰性迭代的,还是首先将所有内容放入
中?我 99.999% 确定它是惰性的,所以我可以将它与生成器函数完全相同,还是我需要注意什么?
I'd like to know what happens when I pass the result of a generator function to python's enumerate(). Example:
def veryBigHello():
i = 0
while i < 10000000:
i += 1
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word
Is the enumeration iterated lazily, or does it slurp everything into the <enumerate object>
first? I'm 99.999% sure it's lazy, so can I treat it exactly the same as the generator function, or do I need to watch out for anything?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它很懒。证明情况确实如此是相当容易的:
It's lazy. It's fairly easy to prove that's the case:
它比之前的建议更容易判断:
如果 enumerate 没有执行惰性求值,它将返回
[(0,'a'), (1,'b'), (2,'c') ]
或一些(几乎)等效的东西。当然,枚举实际上只是一个奇特的生成器:
It's even easier to tell than either of the previous suggest:
If enumerate didn't perform lazy evaluation it would return
[(0,'a'), (1,'b'), (2,'c')]
or some (nearly) equivalent.Of course, enumerate is really just a fancy generator:
由于您可以调用此函数而不会出现内存不足异常,因此它绝对是懒惰的
Since you can call this function without getting out of memory exceptions it definitly is lazy
老派的替代方案,因为我使用的是其他人(sklearn)编写的生成器,该生成器不适用于此处的方法。
Old school alternative since I was using a generator that someone else (sklearn) wrote that didn't work with the approaches here.