Kilka uwag na temat czasu:
Jeśli zaczynasz od listy, l.append(l.pop(0))jest to najszybsza metoda, jakiej możesz użyć. Można to pokazać przy samej złożoności czasowej:
- deque.rotate to O (k) (k = liczba elementów)
- konwersja listy do deque to O (n)
- zarówno list.append, jak i list.pop są O (1)
Jeśli więc zaczynasz od dequeobiektów, możesz to zrobić deque.rotate()kosztem O (k). Ale jeśli punktem początkowym jest lista, złożoność czasowa użycia deque.rotate()wynosi O (n). l.append(l.pop(0)jest szybszy przy O (1).
Dla ilustracji, oto kilka przykładowych czasów dla iteracji 1M:
Metody wymagające konwersji typu:
deque.rotatez obiektem deque : 0,12380790710449219 sekund (najszybszy)
deque.rotatez konwersją typu: 6,853878974914551 sekund
np.rollz nparray: 6.0491721630096436 sekund
np.rollz konwersją typu: 27.558452129364014 sekund
Wymień metody wymienione tutaj:
l.append(l.pop(0)): 0,32483696937561035 sekund (najszybszy)
- „
shiftInPlace”: 4,819645881652832 sekund
- ...
Zastosowany kod czasowy znajduje się poniżej.
collections.deque
Pokazuje, że tworzenie deques z list to O (n):
from collections import deque
import big_o
def create_deque_from_list(l):
return deque(l)
best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best
# --> Linear: time = -2.6E-05 + 1.8E-08*n
Jeśli chcesz utworzyć obiekty deque:
Iteracje 1M @ 6.853878974914551 sekund
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""
test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
Jeśli masz już obiekty deque:
1M iteracje @ 0,12380790710449219 sekund
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""
test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
np.roll
Jeśli potrzebujesz stworzyć nparrays
1M iteracje @ 27.558452129364014 sekund
setup_np_roll_with_create_npa = """
import numpy as np
import random
l = [random.random() for i in range(1000)]
"""
test_np_roll_with_create_npa = """
np.roll(l,-1) # implicit conversion of l to np.nparray
"""
Jeśli masz już nparrays:
1M iteracji @ 6.0491721630096436 sekund
setup_np_roll_alone = """
import numpy as np
import random
l = [random.random() for i in range(1000)]
npa = np.array(l)
"""
test_roll_alone = """
np.roll(npa,-1)
"""
timeit.timeit(test_roll_alone, setup_np_roll_alone)
„Przesunięcie w miejscu”
Nie wymaga konwersji typu
1M iteracje @ 4,819645881652832 sekundy
setup_shift_in_place="""
import random
l = [random.random() for i in range(1000)]
def shiftInPlace(l, n):
n = n % len(l)
head = l[:n]
l[:n] = []
l.extend(head)
return l
"""
test_shift_in_place="""
shiftInPlace(l,-1)
"""
timeit.timeit(test_shift_in_place, setup_shift_in_place)
l.append (l.pop (0))
Nie wymaga konwersji typu
1M iteracje @ 0,32483696937561035
setup_append_pop="""
import random
l = [random.random() for i in range(1000)]
"""
test_append_pop="""
l.append(l.pop(0))
"""
timeit.timeit(test_append_pop, setup_append_pop)