[英]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
這假設可迭代是有限的。
對於空的可迭代對象, first
和last
設置為defaultvalue
。 對於只有一個元素的可迭代對象, first
和last
都將引用該元素。 對於任何其他有限可迭代對象, 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
根據我的測試, islice比for: 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.