使用
itertools配方
consume跳过
n元素:
def consume(iterator, n): "Advance the iterator n-steps ahead. If n is none, consume entirely." # Use functions that consume iterators at C speed. if n is None: # feed the entire iterator into a zero-length deque collections.deque(iterator, maxlen=0) else: # advance to the empty slice starting at position n next(islice(iterator, n, n), None)
注意
islice()那里的电话;它使用
n, n,实际上不返回 任何内容 ,并且该
next()函数返回到默认值。
简化为示例,您要跳过999999个元素,然后返回元素1000000:
return next(islice(permutations(range(10)), 999999, 1000000))
islice()处理C语言中的迭代器,Python循环无法胜任。
为了说明这一点,以下是每种方法仅重复10次的时间:
>>> from itertools import islice, permutations>>> from timeit import timeit>>> def list_index():... return list(permutations(range(10)))[999999]... >>> def for_loop():... p = permutations(range(10))... for i in xrange(999999): p.next()... return p.next()... >>> def enumerate_loop():... p = permutations(range(10))... for i, element in enumerate(p):... if i == 999999:... return element... >>> def islice_next():... return next(islice(permutations(range(10)), 999999, 1000000))... >>> timeit('f()', 'from __main__ import list_index as f', number=10)5.550895929336548>>> timeit('f()', 'from __main__ import for_loop as f', number=10)1.6166789531707764>>> timeit('f()', 'from __main__ import enumerate_loop as f', number=10)1.2498459815979004>>> timeit('f()', 'from __main__ import islice_next as f', number=10)0.18969106674194336该
islice()方法比下一个最快的方法快近7倍。



