Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取python迭代器的第一个和最后一个元素的最快方法_Python_Iterator_Memory Efficient - Fatal编程技术网

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

获取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 有人对一种更快的方法有什么看法吗?非常感谢 使用以下命令获取第一个值: 这假

我正试图对一个interator的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果被发现,我就会采取这个策略

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