Pregunta ¿Cuál es la diferencia entre las funciones range y xrange en Python 2.X?


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 sea más rápido) o lo que además de eso es diferente sobre

for i in range(0, 20):
for i in xrange(0, 20):

613
2017-09-18 17:52


origen


Respuestas:


rango 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 evalúa perezosamente.

Debería agregarse desde la sugerencia de @ Thiago, que en python3, el rango hace el equivalente al xrange de python


702
2017-09-18 17:55



rango crea una lista, así que si lo hace range(1, 10000000) crea una lista en la memoria con 9999999 elementos.

xrange  es un generador, entonces es un objeto de secuencia es un eso se evalúa perezosamente

Esto es cierto, pero en Python 3, el rango será implementado por Python 2 xrange (). Si necesita generar realmente la lista, deberá hacer lo siguiente:

list(range(1,100))

210
2017-09-18 18:08



Recuerde, use el módulo timeit para probar cuál de los pequeños snipps de código es más rápido.

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

Personalmente, siempre uso range (), a menos que tuviera que lidiar con De Verdad listas 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, el xrange desaparecerá y el rango te dará un buen comportamiento de iterador.


99
2017-09-18 22:11



xrange solo almacena los parámetros de rango y genera los números a pedido. Sin embargo, la implementación C de Python actualmente restringe sus argumentos a C longitudes:

xrange(2**32-1, 2**32+1)  # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1)   # OK --> [4294967295L, 4294967296L]

Tenga en cuenta que en Python 3.0 solo hay range y se comporta como el 2.x xrange pero sin las limitaciones en los puntos finales mínimo y máximo.


64
2017-09-18 18:13



xrange devuelve un iterador y solo mantiene un número en la memoria a la vez. rango mantiene toda la lista de números en la memoria.


36
2017-09-18 17:55



Pase tiempo con el Referencia de biblioteca. Mientras más familiarizado estés con él, más rápido podrás encontrar respuestas a preguntas como esta. Especialmente importantes son los primeros capítulos sobre objetos y tipos incorporados.

La ventaja del tipo xrange es que un objeto xrange siempre   tome la misma cantidad de memoria, sin importar el tamaño del rango que representa.   No hay ventajas de rendimiento consistentes.

Otra forma de encontrar información rápida sobre una construcción de Python es la docstring y la función de ayuda:

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)

28
2017-09-18 17:55



rango () vs xrange () en python:

range () y xrange () son dos funciones que se podrían usar para iterar un cierto número de veces en bucles for en Python. En Python 3, no hay xrange, pero la función de rango se comporta como xrange en Python 2. Si desea escribir código que se ejecutará en Python 2 y Python 3, debe usar range ().

distancia() - Esto devuelve una lista de números creados usando la función range ().

xrange () - Esta función devuelve el objeto del generador que se puede usar para mostrar los números solo mediante un bucle. Solo se muestra un rango particular bajo demanda y, por lo tanto, se denomina "evaluación diferida".

Ambos se implementan de diferentes maneras y tienen diferentes características asociadas a ellos. Los puntos de las comparaciones son:

  1. Tipo de retorno Operación de memoria Velocidad de uso
  2. Memoria
  3. Uso de la operación
  4. Velocidad

1. Tipo de devolución:

range () devuelve - la lista como tipo de devolución.

xrange () regresa - objeto xrange ()

# initializing a with range()
a = range(1,10000)

# initializing a with xrange()
x = xrange(1,10000)

# testing the type of a
print ("The return type of range() is : ")
print (type(a))

# testing the type of x
print ("The return type of xrange() is : ")
print (type(x))

Salida:

The return type of range() is :
<type 'list'>
The return type of xrange() is :
<type 'xrange'>

2. Memoria:

La variable que almacena el rango creado por range () toma más memoria en comparación con la variable que almacena el rango usando xrange (). La razón básica para esto es el tipo de retorno de range () es list y xrange () es objeto de xrange ().

# initializing a with range()
a = range(1,10000)

# initializing a with xrange()
x = xrange(1,10000)

# testing the size of a
print ("The size allotted using range() is : ")
print (sys.getsizeof(a))

# testing the size of a
print ("The size allotted using xrange() is : ")
print (sys.getsizeof(x))

Salida:

The size allotted using range() is : 
80064
The size allotted using xrange() is : 
40

3. Uso de operaciones:

Como range () devuelve la lista, se pueden usar todas las operaciones que se pueden aplicar en la lista. Por otro lado, como xrange () devuelve el objeto xrange, las operaciones asociadas a la lista no se pueden aplicar sobre ellas, de ahí una desventaja.

# Python code to demonstrate range() vs xrange()
# on  basis of operations usage 

# initializing a with range()
a = range(1,6)

# initializing a with xrange()
x = xrange(1,6)

# testing usage of slice operation on range()
print ("The list after slicing using range is : ")
print (a[2:5])

# testing usage of slice operation on xrange()
print ("The list after slicing using xrange is : ")
print (x[2:5])

Salida: 

The list after slicing using range is :
[3, 4, 5]
The list after slicing using xrange is :
Traceback (most recent call last):
  File "pp.py", line 18, in <module>
    print (x[2:5])
TypeError: sequence index must be integer, not 'slice'

4. Velocidad:

Debido al hecho de que xrange () solo evalúa el objeto generador que contiene solo los valores que son requeridos por la evaluación diferida, por lo tanto, es más rápido en la implementación que range ().

Puntos importantes :

  1. Si quieres escribir código que se ejecutará en Python 2 y Python 3, usa range () ya que la función de xrange está en desuso en Python 3.
  2. range () es más rápido si se itera sobre la misma secuencia múltiple veces.
  3. xrange () tiene que reconstruir el objeto entero cada vez, pero range () tendrá objetos enteros reales. (Siempre funcionará peor en términos de memoria, sin embargo).

Referencia 


15
2017-11-05 07:02