获取python迭代器的第一个和最后一个元素的最快方法

时间:2013-11-20 19:00:31

标签: python iterator memory-efficient

我试图对交互者的第一个和最后一个元素执行检查。它有几千个条目,所以我需要一种快速的检查方法。如果找到this post,那就让我接受了这个策略。

first = True
for value in iterator:
   if first:
      do_stuff_to_first_iter
      first = False
   else:
      pass
do_stuff_to_last_iter

任何人对更快速完成此方法有什么意见?非常感谢!

4 个答案:

答案 0 :(得分:16)

使用next() function获取第一个值:

first = last = next(iterable, defaultvalue)
for last in iterable:
    pass

这假设迭代是有限的。

对于空的可迭代,firstlast设置为defaultvalue。对于只有一个元素的可迭代,firstlast都将引用该元素。对于任何其他有限迭代,first将具有第一个元素,last是最后一个元素。

答案 1 :(得分:3)

根据我对相关问题的回答:

如果可用,可能值得使用__reversed__。如果你提供迭代器,并且有一种合理的方法来实现__reversed__(即没有从头到尾迭代)你应该这样做

first = last = next(my_iter)
if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass

答案 2 :(得分:1)

你可以使用maxlen为1的双端队列来快速获取有限迭代器的最后一个元素:

>>> from collections import deque
>>> last_getter = deque(maxlen=1)
>>> seq = range(10000)
>>> iseq = iter(seq)
>>>
>>> first = last = next(iseq, None)
>>> last_getter.extend(iseq)
>>> if last_getter: last = last_getter[0]
...
>>> print (first, last)
0 9999

答案 3 :(得分:1)

根据我的测试,islicefor: passdeque快3倍。但这需要你知道会有多少项目。

last = next(islice(iterable, length - 1, length))

或者,如果您不知道全长,但确实知道它必须至少 n,您仍然可以“跳过”n作为快捷键:

rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
    pass