As you found out, there is no way to cut a collections.deque. But it supports rotation, which can be used in this case:
last_n = 10
my_deque.rotate(last_n)
for i in itertools.islice(my_deque, last_n):
pass
itertools.islice , , stop. , , list deque s. islice deque. rotate, islice 10 .
, , , :
from collections import deque
import itertools
my_deque = deque(range(10000))
my_list = list(range(10000))
:
%%timeit
my_deque.rotate(10)
for i in itertools.islice(my_deque, 10):
pass
my_deque.rotate(-10)
2,76 ± 41,6 ( ± 7 , 100000 )
%%timeit
start = max(0, len(my_deque) - 10)
for i in itertools.islice(my_deque, start, None):
pass
136 ± 8,08 ( ± 7 , 10000 )
%%timeit
start = max(0, len(my_list) - 10)
for i in itertools.islice(my_list, start, None):
pass
119 ± 1,64 ( ± 7 , 10000 )
%timeit my_list[-10:]
434 ns ± 12,5 ( ± 7 , 1000000 )
, ( ~ 5 ), (~ 50 ), islice.