เพียงบันทึกบางส่วนเกี่ยวกับเวลา:
หากคุณเริ่มต้นด้วยรายการl.append(l.pop(0))
เป็นวิธีที่เร็วที่สุดที่คุณสามารถใช้ได้ สิ่งนี้สามารถแสดงได้ด้วยความซับซ้อนของเวลาเพียงอย่างเดียว:
- deque.rotate คือO (k) (k = จำนวนองค์ประกอบ)
- รายการที่ต้องการยกเลิกการแปลงคือO (n)
- list.append และ list.pop เป็นทั้งO (1)
ดังนั้นหากคุณเริ่มต้นด้วยdeque
วัตถุคุณสามารถทำได้deque.rotate()
ที่ O (k) แต่ถ้าจุดเริ่มต้นคือรายการความซับซ้อนของเวลาในการใช้deque.rotate()
คือ O (n) l.append(l.pop(0)
เร็วกว่าที่ O (1)
นี่เป็นตัวอย่างการกำหนดเวลาในการวนซ้ำ 1M:
วิธีการที่ต้องการการแปลงประเภท:
deque.rotate
ด้วยวัตถุ deque: 0.12380790710449219 วินาที (เร็วที่สุด)
deque.rotate
ด้วยการแปลงประเภท: 6.853878974914551 วินาที
np.roll
ด้วย nparray: 6.0491721630096436 วินาที
np.roll
ด้วยการแปลงประเภท: 27.558452129364014 วินาที
รายการวิธีที่กล่าวถึงที่นี่:
l.append(l.pop(0))
: 0.32483696937561035 วินาที (เร็วที่สุด)
- "
shiftInPlace
": 4.819645881652832 วินาที
- ...
รหัสเวลาที่ใช้อยู่ด้านล่าง
collections.deque
แสดงว่าการสร้าง deques จากรายการคือ 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
หากคุณต้องการสร้างออบเจกต์ deque:
การซ้ำ 1M @ 6.853878974914551 วินาที
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)
หากคุณมี deque objects อยู่แล้ว:
การซ้ำ 1M @ 0.12380790710449219 วินาที
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
ถ้าคุณต้องการสร้าง nparrays
การซ้ำ 1M @ 27.558452129364014 วินาที
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
"""
หากคุณมี nparrays อยู่แล้ว:
การซ้ำ 1M @ 6.0491721630096436 วินาที
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)
"เปลี่ยนตำแหน่ง"
ต้องไม่มีการแปลงประเภท
การซ้ำ 1M @ 4.819645881652832 วินาที
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))
ต้องไม่มีการแปลงประเภท
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)