Nur ein paar Hinweise zum Timing:
Wenn Sie mit einer Liste beginnen, l.append(l.pop(0))
ist dies die schnellste Methode, die Sie verwenden können. Dies kann allein mit zeitlicher Komplexität gezeigt werden:
- deque.rotate ist O (k) (k = Anzahl der Elemente)
- Die Konvertierung von Liste zu Deque ist O (n).
- list.append und list.pop sind beide O (1)
Wenn Sie also mit deque
Objekten beginnen, können Sie dies deque.rotate()
auf Kosten von O (k) tun. Wenn der Ausgangspunkt jedoch eine Liste ist, beträgt die zeitliche Komplexität der Verwendung deque.rotate()
O (n). l.append(l.pop(0)
ist bei O (1) schneller.
Zur Veranschaulichung sind hier einige Beispiel-Timings für 1M-Iterationen aufgeführt:
Methoden, die eine Typkonvertierung erfordern:
deque.rotate
mit Deque-Objekt: 0,12380790710449219 Sekunden (am schnellsten)
deque.rotate
mit Typkonvertierung: 6.853878974914551 Sekunden
np.roll
mit nparray: 6.0491721630096436 Sekunden
np.roll
mit Typkonvertierung: 27.558452129364014 Sekunden
Hier erwähnte Methoden auflisten:
l.append(l.pop(0))
: 0,32483696937561035 Sekunden (am schnellsten)
- "
shiftInPlace
": 4.819645881652832 Sekunden
- ...
Der verwendete Timing-Code ist unten.
collection.deque
Zeigen, dass das Erstellen von Deques aus Listen O (n) ist:
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
Wenn Sie Deque-Objekte erstellen müssen:
1M Iterationen @ 6.853878974914551 Sekunden
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)
Wenn Sie bereits Deque-Objekte haben:
1 Million Iterationen bei 0,12380790710449219 Sekunden
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
Wenn Sie nparrays erstellen müssen
1M Iterationen @ 27.558452129364014 Sekunden
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
"""
Wenn Sie bereits nparrays haben:
1M Iterationen @ 6.0491721630096436 Sekunden
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)
"Verschieben an Ort und Stelle"
Erfordert keine Typkonvertierung
1M Iterationen @ 4.819645881652832 Sekunden
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))
Erfordert keine Typkonvertierung
1M Iterationen @ 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)