【发布时间】:2011-09-08 01:33:24
【问题描述】:
在下面的示例中,resp.results 是一个迭代器。
版本1:
items = []
for result in resp.results:
item = process(result)
items.append(item)
return iter(items)
版本 2:
for result in resp.results:
yield process(result)
在版本 1 中返回 iter(items) 在性能/内存节省方面是否比简单地返回项目更好/更差?
在“Python Cookbook”中,Alex 说显式 iter()“更灵活但使用频率更低”,但是在版本 2 中返回 iter(items) 与 yield 的优缺点是什么?
另外,对迭代器和/或产量进行单元测试的最佳方法是什么? -- 你不能用 len(results) 来检查列表的大小吗?
【问题讨论】:
-
嗯。版本 2 更短,并且不创建中间列表对象。你为什么不简单地每次都使用它?为什么你认为这些是“模棱两可的”或“等效的”?仅仅返回一个迭代器并不是真正的问题,是吗?
-
这里对yield关键字有很好的解释:stackoverflow.com/questions/231767/…
-
那么你什么时候使用 iter() -- 根据 (stackoverflow.com/questions/231767/…) -- 'for' 循环不会自动对所有列表执行 'iter(mylist)' 吗?跨度>
-
S.Lott - AFAIK 你不能重用生成器,所以迭代器更灵活。
-
@James 为什么不创建另一个生成器?我觉得没那么贵。
标签: python unit-testing iterator yield