Używam Python 3.2.3. Jaki jest najszybszy sposób na powtórzenie listy w odwrotnej kolejności? [:: - 1], odwrócony, list.reverse() czy może jakiś inny sposób? Mam do czynienia z listą około 5e6 elementów, więc naprawdę muszę unikać kopiowania listy.Konieczność iteracji na liście Pythona odwrotnie tak szybko, jak to możliwe
Odpowiedz
>>> from timeit import Timer
>>> t = Timer('[x for x in l[::-1]]', 'l = list(range(100000))')
>>> t.timeit(number=1000)
5.549649953842163
>>> t = Timer('l.reverse(); [x for x in l]', 'l = list(range(100000))')
>>> t.timeit(number=1000)
4.548457145690918
>>> t = Timer('[x for x in reversed(l)]', 'l = list(range(100000))')
>>> t.timeit(number=1000)
4.428632974624634
Wnioski: odwrócona() jest marginalnie szybszy niż l.reverse() na liście z 100000 pozycji. Jest to oczywiście jeszcze bardziej prawdziwe, jeśli nie zapętlisz się na całej liście i przestanie być prawdziwe, jeśli będziesz używać tej listy więcej niż jeden raz.
l[::-1]
jest nieaktualny od wersji 2.4, która wprowadziła reversed()
.
reversed
powinien być najlepszy, ponieważ zwraca iterator, więc nie kopiuje listy, po prostu daje jeden element na raz. (list.reverse()
również nie skopiuje listę, ale będzie je mutować, więc lista będzie do tyłu po skończysz, natomiast reversed
nie zmienia pierwotną listę.)
Należy zauważyć, że iteratory nie * koniecznie * uniemożliwiają kopiowanie, po prostu działa w tym przypadku. –
To prawda, ale ogólnie wbudowane funkcje pythona, które zapewniają iteratory, nie budują jednocześnie całej listy; o to właśnie chodzi. – BrenBarn
Powinieneś to przetestować samodzielnie. Polecam wypróbowanie modułu ['timeit'] (http://docs.python.org/library/timeit.html). –