获取python迭代器的第一个和最后一个元素的最快方法
我正试图对一个interator的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果被发现,我就会采取这个策略获取python迭代器的第一个和最后一个元素的最快方法,python,iterator,memory-efficient,Python,Iterator,Memory Efficient,我正试图对一个interator的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果被发现,我就会采取这个策略 first = True for value in iterator: if first: do_stuff_to_first_iter first = False else: pass do_stuff_to_last_iter 有人对一种更快的方法有什么看法吗?非常感谢 使用以下命令获取第一个值: 这假
first = True
for value in iterator:
if first:
do_stuff_to_first_iter
first = False
else:
pass
do_stuff_to_last_iter
有人对一种更快的方法有什么看法吗?非常感谢 使用以下命令获取第一个值: 这假设iterable是有限的
对于空的iterable,
first
和last
被设置为defaultvalue
。对于只有一个元素的iterable,first
和last
都将引用该元素。对于任何其他有限iterable,first
将具有第一个元素,last
最后一个元素。根据我对链接问题的回答:
如果可用,则可能值得使用\uuuuuuuuuuuuuuuuuuuuuuu
。如果您提供迭代器,并且有一种合理的方法来实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
first = last = next(my_iter)
if hasattr(my_iter,'__reversed__'):
last = next(reversed(my_iter))
else:
for last in my_iter:
pass
可以使用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
根据我的测试,对于:pass
或deque
,速度是的3倍。不过,这需要您知道将有多少项
last = next(islice(iterable, length - 1, length))
或者,如果您不知道完整长度,但知道它必须至少为n
,您仍然可以“跳过”到n
,作为快捷方式:
rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
pass
为什么任意迭代器应该有最后一个元素?您的示例代码不是有效的python;您是否至少可以对iterable:
中的项使用或类似的Python语法?请注意else:pass
是完全冗余的,可以完全删除。在Python中,不必在if
语句中包含else
子句。else:pass
用于退出for
循环。我想不需要了。谢谢。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。例如,list
提供了它,但不是iter(list)
。在标准库中,只有list()
、range()
、collections.deque()
和collections.orderedict()
提供了一个\uuuuuuuuuuuuuuuu反向
,它们本身都不是迭代器。这意味着您不能对它们调用next()
。我喜欢反转迭代器并避免不必要的循环的选项。不幸的是,我的迭代器没有\uuuuu reversed\uuuuu
属性,我仍然要进入循环。谢谢你的建议!你好,Martijn,谢谢你的回答。这项技术非常类似于python,而且(现在我已经解决了所有的bug)似乎工作得非常好。循环遍历我的迭代器仍然需要大约4分钟的时间,但它比我以前使用的要好。再次感谢。好的,我用Paul的deque
方法来计时。这个方法花了我264秒的时间。deque
方法耗时275秒。可以说,在噪音中。但我要用这个家伙!谢谢。所以我尝试了这个方法,并为我的过程计时。花了275秒。“循环n’传球”技术耗时264秒。无论哪种方式,两者都是可比的。谢谢你的建议!这是一种有趣的技术,我不知道它的存在。
rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
pass