Juste quelques notes sur le timing:
Si vous commencez avec une liste, l.append(l.pop(0))
c'est la méthode la plus rapide que vous pouvez utiliser. Cela peut être démontré avec la seule complexité du temps:
- deque.rotate est O (k) (k = nombre d'éléments)
- la conversion de la liste en deque est O (n)
- list.append et list.pop sont tous deux O (1)
Donc, si vous commencez avec des deque
objets, vous pouvez le faire deque.rotate()
au prix de O (k). Mais, si le point de départ est une liste, la complexité temporelle de l'utilisation deque.rotate()
est O (n). l.append(l.pop(0)
est plus rapide à O (1).
Juste à titre d'illustration, voici quelques exemples de timings sur les itérations 1M:
Méthodes qui nécessitent une conversion de type:
deque.rotate
avec objet deque: 0,12380790710449219 secondes (le plus rapide)
deque.rotate
avec conversion de type: 6,853878974914551 secondes
np.roll
avec nparray: 6.0491721630096436 secondes
np.roll
avec conversion de type: 27,558452129364014 secondes
Liste des méthodes mentionnées ici:
l.append(l.pop(0))
: 0,32483696937561035 secondes (le plus rapide)
- "
shiftInPlace
": 4,819645881652832 secondes
- ...
Le code temporel utilisé est ci-dessous.
collections.deque
Montrer que la création de deques à partir de listes est 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
Si vous devez créer des objets deque:
1M itérations @ 6,853878974914551 secondes
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)
Si vous avez déjà des objets deque:
1M itérations @ 0,12380790710449219 secondes
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
Si vous devez créer des nparrays
1M itérations @ 27,558452129364014 secondes
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
"""
Si vous avez déjà des nparrays:
1M itérations @ 6.0491721630096436 secondes
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)
"Déplacer en place"
Ne nécessite aucune conversion de type
1M itérations @ 4.819645881652832 secondes
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))
Ne nécessite aucune conversion de type
1M itérations @ 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)