समय पर कुछ नोट:
यदि आप एक सूची से शुरू कर रहे हैं, l.append(l.pop(0))
तो सबसे तेज़ तरीका है जिसका आप उपयोग कर सकते हैं। यह अकेले समय जटिलता के साथ दिखाया जा सकता है:
- deque.rotate O (k) (k = तत्वों की संख्या) है
- रूपांतरण की सूची हे (n) है
- list.append और list.pop दोनों O (1) हैं
इसलिए यदि आप deque
वस्तुओं से शुरू कर रहे हैं , तो आप deque.rotate()
ओ (के) की कीमत पर कर सकते हैं । लेकिन, यदि प्रारंभिक बिंदु एक सूची है, तो उपयोग करने की समय जटिलता deque.rotate()
O (n) है। l.append(l.pop(0)
O (1) पर तेज है।
उदाहरण के लिए, यहाँ कुछ नमूने 1M पुनरावृत्तियों पर दिए गए हैं:
जिन तरीकों को टाइप रूपांतरण की आवश्यकता होती है:
deque.rotate
विचित्र वस्तु के साथ: 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
यह दिखाते हुए कि सूचियों से देवता बनाना हे (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
यदि आपको डेक्स ऑब्जेक्ट बनाने की आवश्यकता है:
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)
यदि आपके पास पहले से ही कोई वस्तु है:
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)