iterator - 在 python 中快速迭代可迭代对象(不是列表)的前 n 项

标签 iterator performance python generator

我正在寻找一种 pythonic 方法来迭代可迭代项的第一个 n 项(upd:在常见情况下不是列表,至于列表,事情是琐碎的),并且尽可能快地执行此操作非常重要。这就是我现在的做法:

count = 0
for item in iterable:
 do_something(item)
 count += 1
 if count >= n: break

对我来说似乎不太整洁。另一种方法是:

for item in itertools.islice(iterable, n):
    do_something(item)

这看起来不错,问题是它是否足够快,可以与某些生成器一起使用?例如:

pair_generator = lambda iterable: itertools.izip(*[iter(iterable)]*2)
for item in itertools.islice(pair_generator(iterable), n):
 so_something(item)

与第一种方法相比,它运行得足够快吗? 有更简单的方法吗?

最佳答案

for item in itertools.islice(iterable, n): 是最明显、最简单的方法。它适用于任意可迭代对象并且是 O(n),就像任何理智的解决方案一样。

可以想象,另一种解决方案可能具有更好的性能;没有时间我们就不知道了。我不建议打扰时间,除非你 profile 你的代码并发现这个调用是一个热点。除非它埋在一个内部循环中,否则它会是非常值得怀疑的。过早的优化是万恶之源。


如果我要寻找替代解决方案,我会看看像 for count, item in enumerate(iterable): if count > n: break ...for i in xrange(n): item = next(iterator) ... 这样的解决方案。我不认为这些会有帮助,但如果我们真的想比较事物,它们似乎值得尝试。如果我遇到这样一种情况,我分析并发现这是一个内部循环中的热点(这真的是你的情况吗?),我也会尝试通过获取 islice 属性来简化名称查找全局 iterools 已经将函数绑定(bind)到本地名称。

这些是您只有在证明它们会有所帮助后才能做的事情。人们经常尝试在其他时候这样做。它无助于使他们的程序明显更快;这只会让他们的程序变得更糟。

关于iterator - 在 python 中快速迭代可迭代对象(不是列表)的前 n 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2702158/

相关文章:

python - 在管理页面的 collectstatic 没有 css 之后

Python str.contains 来自两个或多个字典

c++ - 如何在修改容器时正确迭代容器?

java - 为什么 "while (i++ < n) {}"明显比 "while (++i < n) {}"慢

c++ - 如何使用迭代器在 C++ 中的递归函数中传递值?

Python:更快地处理数组

android - 如何在android中显示数学符号、物理、化学方程式?

python - url 中没有端口的 Flask 请求

C++ 从模板迭代器创建 vector

c++ - 以相反的顺序插入 vector