我正在寻找一种 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/