2011-03-18 8 views
8

Soy un principiante en Python, y esta es mi primera publicación, así que no seas demasiado duro :). He estado jugando con Python últimamente y se preguntaba si algo como¿Las listas de comprensión de Python se reducen de manera eficiente?

max([x for x in range(25)]) 

daría lugar a la creación de Python primero una lista de todos los elementos y luego encontrar el máximo, lo que resulta en tiempo O (2n), o mantendría un registro del máximo ya que estaba iterando para Θ (n). Además, dado que el rango difiere en Python3 (siendo iterable), ¿eso lo haría diferente de Python2?

Respuesta

14

Su ejemplo hará que Python cree primero la lista completa. Si se quiere evitar eso, se puede utilizar una expresión generadora lugar:

max((x for x in range(25))) 

o simplemente:

max(x for x in range(25)) 

Por supuesto (en Python 2), range sí construye una lista completa, así que lo que realmente quiero en este caso es:

max(x for x in xrange(25)) 

Sin embargo, en cuanto al tiempo empleado, todas estas expresiones tienen la misma complejidad. La diferencia importante es que el último requiere O (1) espacio, mientras que los otros requieren O (n) espacio.

2

Las listas de comprensión siempre generan una lista (a menos que algo arroje una excepción). El uso de un genex en su lugar se recomienda en la mayoría de los casos.

max(x for x in xrange(25)) 
Cuestiones relacionadas