import timeit
def append2x(foo):
foo.append(1)
foo.append(1)
def extend_lst(foo):
foo.extend([1,1])
def extend_tup(foo):
foo.extend((1,1))
l1 = []
l2 = []
l3 = []
print timeit.timeit('append2x(l1)',setup = 'from __main__ import append2x,l1')
print timeit.timeit('extend_lst(l2)',setup = 'from __main__ import extend_lst,l2')
print timeit.timeit('extend_tup(l3)',setup = 'from __main__ import extend_tup,l3')
Oto prosty benchmark. Moje wyniki (OS-X 10.5.8, Core2Duo, FWIW):
0.520906925201 #append
0.602569103241 #extend-list
0.357008934021 #extend-tuple
I to samo uporządkowanie wyników moim Linuksie (Ubuntu, x86-64 Core i7):
0.307395935059 #append
0.319436073303 #extend-list
0.238317012787 #extend-tuple
dla mnie, to mówi, że extend
jest szybsza niż append
, ale tworząc list
jest stosunkowo drogie w porównaniu do tworzenia tuple
EDIT
wskazano w komentarzach poniżej, ze względu na niezmienność krotek, interpreter może zoptymalizować tworzenie krotki out (tworzy krotki raz i ponownie używa go w kółko). W przypadku zmiany kodu do:
def extend_lst(foo):
v = 1
foo.extend([v,v])
def extend_tup(foo):
v = 1
foo.extend((v,v))
Te czasy są praktycznie identyczne:
0.297003984451 #append
0.344678163528 #extend-list
0.292304992676 #extend-tuple
Chociaż tuple
nadal konsekwentnie bije wersję listy i ledwo krawędzie na wersję append
dla wszystkich prób I zrobili .
Jedną z rzeczy, które zabieram z tego, jest to, że jeśli robisz iterację nad obiektem, który składa się ze wszystkich literałów, wybierz tuple
przez list
. Jeśli nie składa się wyłącznie z literałów, to naprawdę nie ma znaczenia, czy wybierzesz list
lub tuple
.
Jeśli chcesz wiedzieć, zmierz. – NPE
Byłbym bardzo zaskoczony, gdyby 'extend' nie był szybszy niż 2' .appends' – mgilson
Gdybym miał zoptymalizować to, użyłbym [sito Eratostenesa] (http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes), aby znaleźć liczby pierwsze do 'sqrt (28123)', a następnie dla każdego 'i', skompresowałem je i użyłem [' itertools.product'] (http://docs.python.org/2/library /itertools.html#itertools.product), aby uzyskać wszystkie sposoby łączenia czynników w dzielniki i ostatecznie je podsumować. –