2011-07-24 4 views

Respuesta

9

depende de si se desea invertir la lista en contexto (es decir, cambiar la lista) o no. Ninguna otra diferencia real.

A menudo el uso de reversed conduce a un código más agradable.

20

foo.reverse() realmente invierte los elementos en el contenedor. reversed() en realidad no revierte nada, simplemente devuelve un objeto que puede usarse para iterar sobre los elementos del contenedor en orden inverso. Si eso es lo que necesita, a menudo es más rápido que revertir los elementos.

2

Sin conocer las estadísticas reales sobre el rendimiento, _list.reverse() modifica la lista en sí, mientras que reversed(_list) devuelve un iterador listo para recorrer la lista en orden inverso. Esa es una gran diferencia en sí misma.

Si eso no es un problema, object.reverse() me parece más legible, pero tal vez tenga requisitos de velocidad específicos. Y si reverse() no pertenece al 80% del software que consume recursos, no me molestaría (como regla general).

+0

'reversed' no copia, devuelve un iterador. – delnan

+0

tienes razón. Lo arreglé :) – elitalon

6

Parece haber una gran diferencia. Realmente pensé que era al revés. ¿Por qué reorganizar los valores en una lista es más rápido que crear uno nuevo desde un iterador?

from decorators import bench 

_list = range(10 ** 6) 

@ bench 
def foo(): 
  list(reversed(_list)) 

@ bench 
def bar(): 
  _list.reverse() 

foo() 
bar() 

print foo.time 
print bar.time 

0,167278051376
0,0122621059418

+0

La asignación de la memoria en sí no debería tomar demasiado tiempo; IIRC la lista es una sola asignación contigua (PyObject **). Lo más probable es que la diferencia se deba a que 'list (reversed (_list))', aunque el constructor 'list' sea código C, debe ir a través de la API' reverseiterator' en lugar de simplemente intercambiar punteros en un ciclo C estrecho. –

+0

Si tienen que verificar 'listreverseiterator' entonces tienen que verificar todo ... eventualmente se vuelve un poco difícil de manejar, y ralentiza las copias cortas. Además, el caso previsto para ser 'revertido' es cuando va a iterar de todos modos y no necesita crear un temporal. –

+2

Si haces algo con las listas, la imagen cambia. Comparando 'for i in reversed (_list): ...' y '_list.reverse(); for i en _list: ...', _former_ es un poco más rápido. – Weidenrinde

Cuestiones relacionadas