[pyar] xrange (2.7) vs range(3.2)

Facundo Batista facundobatista en gmail.com
Jue Mayo 29 16:29:34 ART 2014


2014-05-29 16:50 GMT+02:00 Claudio Omar Melendrez Baeza
<claudio.melendrez en gmail.com>:

> Python2 tiene range y xrange, donde el segundo es un generador. Python3
> tiene solo range, que es un generador (equivalente al xrange de py2). La
> comparacion en este caso es xrange de Py2 vs. range de Py3. En distintas
> versiones de Python.
>
> Ahora respondiendo la pregunta de Daniel: calculo que sera el interprete
> (CPython), que debe estar mas optimizado para Py2. Creo que hasta que Py3 no
> llegue a un nivel de adopcion aceptable (nunca?) no se van a preocupar
> demasiado por la performance...

¡Es que no son lo mismo!

Sí, son equivalentes, pero la versión de Py3 es más poderosa. Con
algún costo en performance [0], se ve.

Ejemplos donde se nota que el nuevo range es mejor que el viejo xrange:

Py2:
>>> r = xrange(300)
>>> r
xrange(300)
>>> r[::3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'

Py3:
>>> r = range(300)
>>> r
range(0, 300)
>>> r[::3]
range(0, 300, 3)
>>> _[:5]
range(0, 15, 3)
>>> list(_)
[0, 3, 6, 9, 12]

O, directamente:

Py2
>>> xrange(3000000000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Py3
>>> range(3000000000)
range(0, 3000000000)

Slds.

[0] Por otro lado, ¿cuanto sentido tiene medir la performance de un
"for i in range(N): pass", ¿es algo que hacés mucho en tu código?

-- 
.    Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista


More information about the pyar mailing list