Chỉ cần một số lưu ý về thời gian:
Nếu bạn đang bắt đầu với một danh sách, l.append(l.pop(0))
là phương pháp nhanh nhất bạn có thể sử dụng. Điều này có thể được hiển thị với sự phức tạp thời gian một mình:
- deque.rotate là O (k) (k = số phần tử)
- danh sách để chuyển đổi deque là O (n)
- list.append và list.pop đều là O (1)
Vì vậy, nếu bạn đang bắt đầu với deque
các đối tượng, bạn có thể deque.rotate()
với chi phí O (k). Nhưng, nếu điểm bắt đầu là một danh sách, thì độ phức tạp thời gian sử dụng deque.rotate()
là O (n). l.append(l.pop(0)
nhanh hơn ở O (1).
Chỉ để minh họa, đây là một số thời gian mẫu trên các lần lặp 1M:
Các phương thức yêu cầu chuyển đổi loại:
deque.rotate
với đối tượng deque: 0.12380790710449219 giây (nhanh nhất)
deque.rotate
với chuyển đổi loại: 6.853878974914551 giây
np.roll
với nparray: 6.0491721630096436 giây
np.roll
với chuyển đổi loại: 27.558452129364014 giây
Liệt kê các phương pháp được đề cập ở đây:
l.append(l.pop(0))
: 0,32483696937561035 giây (nhanh nhất)
- "
shiftInPlace
": 4.819645881652832 giây
- ...
Mã thời gian được sử dụng là dưới đây.
bộ sưu tập
Cho thấy việc tạo deques từ danh sách là 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
Nếu bạn cần tạo các đối tượng deque:
Lặp lại 1M @ 6.853878974914551 giây
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)
Nếu bạn đã có các đối tượng deque:
Lặp lại 1M @ 0.12380790710449219 giây
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
Nếu bạn cần tạo ra các ngày
Lặp lại 1M @ 27.558452129364014 giây
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
"""
Nếu bạn đã có ngày:
Lặp lại 1M @ 6.0491721630096436 giây
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)
"Chuyển tại chỗ"
Không yêu cầu chuyển đổi loại
Lặp lại 1M @ 4.819645881652832 giây
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))
Không yêu cầu chuyển đổi loại
Lặp lại 1M @ 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)