2012-07-14 15 views
7

Estoy usando Python 3.2.3. ¿Cuál es la forma más rápida de iterar sobre una lista al revés? [:: - 1], invertido, list.reverse() o tal vez de alguna otra manera? Estoy lidiando con una lista de aproximadamente 5e6 elementos más o menos, así que realmente necesito evitar copiar la lista.Necesito iterar en una lista de Python al revés lo más rápido posible

+3

Debe probarlo usted mismo. Te recomiendo que revises el módulo ['timeit'] (http://docs.python.org/library/timeit.html). –

Respuesta

13
>>> 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 

Conclusión: invertida() es marginalmente más rápido que l.reverse() en una lista con 100000 elementos. Esto, por supuesto, es aún más cierto si no buclea toda la lista, y deja de ser cierto si utiliza la lista más de una vez.

l[::-1] está desactualizado desde el 2.4 que introdujo reversed().

13

reversed debe ser el mejor ya que devuelve un iterador, por lo que no copia la lista, solo cede un elemento a la vez. (list.reverse() también no copiará la lista, pero va a mutar, así que la lista será al revés después de que haya terminado, mientras que reversed no modifica la lista original.)

+1

Tenga en cuenta que los iteradores no * necesariamente * impiden la copia, simplemente funciona en este caso. –

+1

Eso es cierto, pero en general las funciones incorporadas de python que proporcionan iteradores no construyen toda la lista a la vez; ese es todo el sentido de ellos. – BrenBarn

Cuestiones relacionadas