Aparentemente, xrange es más rápido, pero no tengo idea de por qué es más rápido (y no hay pruebas además de lo anecdótico hasta ahora que es más rápido) o qué es diferente de eso
for i in range(0, 20):
for i in xrange(0, 20):
En Python 2.x:
range
crea una lista, así que si lo hace range(1, 10000000)
, crea una lista en la memoria con 9999999
elementos.
xrange
es un objeto de secuencia que se evalúa perezosamente.
En Python 3, range
hace el equivalente de Python xrange
, y para obtener la lista, debe usar list(range(...))
.
xrange(x).__iter__()
Es un generador.i
se evalúa a demanda en lugar de en la inicialización.Esto es cierto, pero en Python 3, Python 2
.range()
lo implementará.xrange()
. Si realmente necesita generar la lista, deberá hacer lo siguiente:fuente
xrange
un generador? Es una función que contiene unayield
declaración y, según el glosario, tales funciones se denominan generadores.¡Recuerde, use el
timeit
módulo para probar cuál de los pequeños fragmentos de código es más rápido!Personalmente, siempre uso
.range()
, a menos que estuviera lidiando con listas realmente enormes, como puede ver, en cuanto al tiempo, para una lista de un millón de entradas, la sobrecarga adicional es de solo 0.04 segundos. Y como señala Corey, en Python 3.0.xrange()
desaparecerá y.range()
le dará un buen comportamiento de iterador de todos modos.fuente
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
no es la forma correcta de verla,(90.5-51.1)/51.1 = 1.771 times slower
es correcta porque transmite que si este es el bucle central de su programa, puede potencialmente obstaculizarlo. Sin embargo, si esta es una parte pequeña, 1.77x no es mucho.xrange
solo almacena los parámetros de rango y genera los números a pedido. Sin embargo, la implementación en C de Python actualmente restringe sus argumentos a C largos:Tenga en cuenta que en Python 3.0 solo existe
range
y se comporta como el 2.xxrange
pero sin las limitaciones en los puntos finales mínimos y máximos.fuente
xrange devuelve un iterador y solo mantiene un número en la memoria a la vez. range mantiene la lista completa de números en la memoria.
fuente
xrange
no no devolver un iterador.and only keeps one number in memory at a time
y donde se colocan el resto por favor guíame ..Pase algún tiempo con la Referencia de la biblioteca . Cuanto más familiarizado esté con él, más rápido podrá encontrar respuestas a preguntas como esta. Especialmente importantes son los primeros capítulos sobre objetos y tipos incorporados.
Otra forma de encontrar información rápida sobre una construcción de Python es la cadena de documentación y la función de ayuda:
fuente
Estoy sorprendido de que nadie lea el documento :
fuente
Esto te trae dos ventajas:
MemoryError
.fuente
Encontrará la ventaja de
xrange
másrange
en este simple ejemplo:El ejemplo anterior no refleja nada sustancialmente mejor en caso de
xrange
.Ahora mira el siguiente caso donde
range
es realmente muy lento, en comparación conxrange
.Con
range
, ya crea una lista de 0 a 100000000 (consume mucho tiempo), peroxrange
es un generador y solo genera números en función de la necesidad, es decir, si la iteración continúa.En Python-3, la implementación de la
range
funcionalidad es la misma quexrange
en Python-2, mientras que se ha eliminadoxrange
en Python-3Feliz codificación !!
fuente
Es por razones de optimización.
range () creará una lista de valores de principio a fin (0 .. 20 en su ejemplo). Esto se convertirá en una operación costosa en rangos muy grandes.
xrange () por otro lado está mucho más optimizado. solo calculará el siguiente valor cuando sea necesario (a través de un objeto de secuencia xrange) y no creará una lista de todos los valores como hace range ().
fuente
range(x,y)
devuelve una lista de cada número entre x e y si usa unfor
bucle, entoncesrange
es más lento. De hecho,range
tiene un rango de índice más grande.range(x.y)
imprimirá una lista de todos los números entre x e yxrange(x,y)
vuelvexrange(x,y)
pero si usaste unfor
bucle, entoncesxrange
es más rápido.xrange
tiene un rango de índice más pequeño.xrange
no solo se imprimirá,xrange(x,y)
sino que también conservará todos los números que contiene.Si usa un
for
bucle, entonces funcionaría¡No hay mucha diferencia al usar bucles, aunque hay una diferencia cuando solo se imprime!
fuente
range (): range (1, 10) devuelve una lista de 1 a 10 números y mantiene la lista completa en la memoria.
xrange (): al igual que range (), pero en lugar de devolver una lista, devuelve un objeto que genera los números en el rango a pedido. Para el bucle, esto es ligeramente más rápido que range () y más eficiente en memoria. xrange () objeto como un iterador y genera los números a pedido. (Evaluación diferida)
fuente
Algunas de las otras respuestas mencionan que Python 3 eliminó 2.x's
range
y renombró 2.x'sxrange
arange
. Sin embargo, a menos que esté utilizando 3.0 o 3.1 (que nadie debería usar), en realidad es un tipo algo diferente.Como dicen los documentos 3.1 :
Sin embargo, en 3.2+,
range
es una secuencia completa: admite cortes extendidos y todos los métodoscollections.abc.Sequence
con la misma semántica que alist
. * *Y, al menos en CPython y PyPy (las únicas dos implementaciones 3.2+ que existen actualmente), también tiene implementaciones de tiempo constante de
index
y loscount
métodos y elin
operador (el tiempo que pasa únicamente se enteros). Esto significa que la escritura123456 in r
es razonable en 3.2+, mientras que en 2.7 o 3.1 sería una idea horrible.* El hecho de que
issubclass(xrange, collections.Sequence)
regreseTrue
en 2.6-2.7 y 3.0-3.1 es un error que se corrigió en 3.2 y no se soportó.fuente
En python 2.x
range (x) devuelve una lista, que se crea en la memoria con x elementos.
xrange (x) devuelve un objeto xrange que es un obj generador que genera los números a pedido. se calculan durante for-loop (Lazy Evaluation).
Para el bucle, esto es ligeramente más rápido que range () y más eficiente en memoria.
fuente
xrange()
No es un generador.xrange(n)
.__ iter __ () `es.Al probar el rango contra xrange en un bucle (sé que debería usar timeit , pero esto fue rápidamente pirateado de la memoria usando un simple ejemplo de comprensión de lista) encontré lo siguiente:
lo que da:
O, usando xrange en el bucle for:
¿Mi fragmento se está probando correctamente? ¿Algún comentario sobre la instancia más lenta de xrange? O un mejor ejemplo :-)
fuente
xrange
parecía un poco más rápido, aunque con Python 3 la comparación ahora es redundante.timeit
sirve. Se encarga de ejecutar muchas veces, deshabilitar GC, usar el mejor reloj en lugar detime
, etc.xrange () y range () en python funcionan de manera similar para el usuario, pero la diferencia viene cuando hablamos de cómo se asigna la memoria al usar ambas funciones.
Cuando usamos range () asignamos memoria para todas las variables que está generando, por lo que no se recomienda usar con no. de variables a generar.
xrange () por otro lado genera solo un valor particular a la vez y solo puede usarse con el bucle for para imprimir todos los valores requeridos.
fuente
range genera la lista completa y la devuelve. xrange no: genera los números en la lista a pedido.
fuente
xrange utiliza un iterador (genera valores sobre la marcha), el rango devuelve una lista.
fuente
¿Qué?
range
devuelve una lista estática en tiempo de ejecución.xrange
devuelve unobject
(que actúa como un generador, aunque ciertamente no es uno) a partir del cual se generan valores cuando sea necesario.¿Cuándo usar cuál?
xrange
si desea generar una lista para un rango gigantesco, digamos mil millones, especialmente cuando tiene un "sistema sensible a la memoria" como un teléfono celular.range
si desea recorrer la lista varias veces.PD: Python 3.x
range
función de Python 2.x ==xrange
función.fuente
xrange
no devuelve un objeto generador.Todos lo han explicado mucho. Pero quería que lo viera por mí mismo. Yo uso python3. Entonces, abrí el monitor de recursos (¡en Windows!), Y primero ejecuté el siguiente comando primero:
y luego verificó el cambio en la memoria 'En uso'. Fue insignificante. Luego, ejecuté el siguiente código:
Y tomó una gran parte de la memoria para su uso, al instante. Y estaba convencido. Puedes probarlo por ti mismo.
Si está utilizando Python 2X, reemplace 'range ()' con 'xrange ()' en el primer código y 'list (range ())' con 'range ()'.
fuente
De los documentos de ayuda.
Python 2.7.12
Python 3.5.2
La diferencia es aparente. En Python 2.x,
range
devuelve una lista,xrange
devuelve un objeto xrange que es iterable.En Python 3.x, se
range
conviertexrange
en Python 2.x, yxrange
se elimina.fuente
En un requisito para escanear / imprimir elementos 0-N, el rango y el rango x funcionan de la siguiente manera.
range (): crea una nueva lista en la memoria y toma todo el 0 a N elementos (totalmente N + 1) y los imprime. xrange (): crea una instancia de iterador que escanea a través de los elementos y mantiene solo el elemento actual encontrado en la memoria, por lo tanto, utiliza la misma cantidad de memoria todo el tiempo.
En caso de que el elemento requerido esté algo al principio de la lista solo entonces ahorra una buena cantidad de tiempo y memoria.
fuente
xrange
no crea una instancia de iterador. Crea unxrange
objeto, que es iterable, pero no un iterador, casi (pero no del todo) una secuencia, como una lista.El rango devuelve una lista, mientras que xrange devuelve un objeto xrange que toma la misma memoria independientemente del tamaño del rango, ya que en este caso, solo se genera un elemento y está disponible por iteración, mientras que en caso de usar el rango, todos los elementos se generan a la vez y están disponibles en la memoria.
fuente
La diferencia disminuye para argumentos más pequeños para
range(..)
/xrange(..)
:En este caso
xrange(100)
es solo un 20% más eficiente.fuente
range: -range completará todo a la vez, lo que significa que cada número del rango ocupará la memoria.
xrange: -xrange es algo así como un generador, aparecerá en la imagen cuando desee el rango de números pero no desee que se almacenen, como cuando desea usarlo para loop.so memoria eficiente.
fuente
Además, si hacer
list(xrange(...))
será equivalente arange(...)
.Entonces
list
es lento.también
xrange
realmente no termina completamente la secuenciaPor eso no es una lista, es un
xrange
objetofuente
range()
en Python2.x
Esta función es esencialmente la
range()
función anterior que estaba disponible en Python2.x
y devuelve una instancia de unlist
objeto que contiene los elementos en el rango especificado.Sin embargo, esta implementación es demasiado ineficiente cuando se trata de inicializar una lista con un rango de números. Por ejemplo,
for i in range(1000000)
sería un comando muy costoso de ejecutar, tanto en términos de memoria como de uso de tiempo, ya que requiere el almacenamiento de esta lista en la memoria.range()
en Python3.x
yxrange()
en Python2.x
Python
3.x
introdujo una implementación más nueva derange()
(mientras que la implementación más nueva ya estaba disponible en Python a2.x
través dexrange()
función).El
range()
explota una estrategia conocida como evaluación perezosa. En lugar de crear una gran lista de elementos dentro del rango, la implementación más reciente introduce la claserange
, un objeto liviano que representa los elementos requeridos en el rango dado, sin almacenarlos explícitamente en la memoria (esto puede sonar como generadores, pero el concepto de evaluación diferida es diferente).Como ejemplo, considere lo siguiente:
y
fuente
Ver esta publicación para encontrar la diferencia entre rango y xrange:
Citar:
fuente
xrange
No es un iterador. La lista devuelta porrange
admite la iteración (una lista es prácticamente el ejemplo prototípico de un iterable). El beneficio general dexrange
no es "mínimo". Y así.