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:
rangecrea una lista, así que si lo hace range(1, 10000000), crea una lista en la memoria con 9999999elementos.
xrange es un objeto de secuencia que se evalúa perezosamente.
En Python 3, rangehace el equivalente de Python xrange, y para obtener la lista, debe usar list(range(...)).
xrange(x).__iter__()Es un generador.ise 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
xrangeun generador? Es una función que contiene unayielddeclaración y, según el glosario, tales funciones se denominan generadores.¡Recuerde, use el
timeitmó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 secondsno es la forma correcta de verla,(90.5-51.1)/51.1 = 1.771 times sloweres 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.xrangesolo 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
rangey se comporta como el 2.xxrangepero 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
xrangeno no devolver un iterador.and only keeps one number in memory at a timey 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
xrangemásrangeen este simple ejemplo:El ejemplo anterior no refleja nada sustancialmente mejor en caso de
xrange.Ahora mira el siguiente caso donde
rangees realmente muy lento, en comparación conxrange.Con
range, ya crea una lista de 0 a 100000000 (consume mucho tiempo), peroxrangees 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
rangefuncionalidad es la misma quexrangeen Python-2, mientras que se ha eliminadoxrangeen 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 unforbucle, entoncesrangees más lento. De hecho,rangetiene 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 unforbucle, entoncesxrangees más rápido.xrangetiene un rango de índice más pequeño.xrangeno solo se imprimirá,xrange(x,y)sino que también conservará todos los números que contiene.Si usa un
forbucle, 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
rangey renombró 2.x'sxrangearange. 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+,
rangees una secuencia completa: admite cortes extendidos y todos los métodoscollections.abc.Sequencecon 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
indexy loscountmétodos y elinoperador (el tiempo que pasa únicamente se enteros). Esto significa que la escritura123456 in res 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)regreseTrueen 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
xrangeparecía un poco más rápido, aunque con Python 3 la comparación ahora es redundante.timeitsirve. 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é?
rangedevuelve una lista estática en tiempo de ejecución.xrangedevuelve 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?
xrangesi 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.rangesi desea recorrer la lista varias veces.PD: Python 3.x
rangefunción de Python 2.x ==xrangefunción.fuente
xrangeno 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,
rangedevuelve una lista,xrangedevuelve un objeto xrange que es iterable.En Python 3.x, se
rangeconviertexrangeen Python 2.x, yxrangese 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
xrangeno crea una instancia de iterador. Crea unxrangeobjeto, 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
listes lento.también
xrangerealmente no termina completamente la secuenciaPor eso no es una lista, es un
xrangeobjetofuente
range()en Python2.xEsta función es esencialmente la
range()función anterior que estaba disponible en Python2.xy devuelve una instancia de unlistobjeto 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.xyxrange()en Python2.xPython
3.xintrodujo una implementación más nueva derange()(mientras que la implementación más nueva ya estaba disponible en Python a2.xtravé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
xrangeNo es un iterador. La lista devuelta porrangeadmite la iteración (una lista es prácticamente el ejemplo prototípico de un iterable). El beneficio general dexrangeno es "mínimo". Y así.