簡體   English   中英

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

[英]Fastest way to get the first and last element of a python iterator

我正在嘗試對交互器的第一個和最后一個元素執行檢查。 它有幾千個條目,所以我需要一種快速的檢查方法。 如果找到這篇文章,那就讓我采用了這個策略。

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

任何人都對更快地完成此操作有任何意見嗎? 非常感謝!

使用next()函數獲取第一個值:

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

這假設可迭代是有限的。

對於空的可迭代對象, firstlast設置為defaultvalue 對於只有一個元素的可迭代對象, firstlast都將引用該元素。 對於任何其他有限可迭代對象, first將擁有第一個元素, last是最后一個元素。

根據我對鏈接問題的回答:

如果可用,可能值得使用__reversed__ 如果您提供迭代器,並且有一種明智的方法來實現__reversed__ (即沒有__reversed__迭代),您應該這樣做

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

根據我的測試, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM