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

Claudio Freire klaussfreire en gmail.com
Jue Mayo 29 16:34:45 ART 2014


Nono, creo que Germán tiene la posta.

Es el costo elevado de PyLong_FromLong:

~> python -m timeit -s 'l = (None,) * 1000000' 'for x in enumerate(l): pass'
10 loops, best of 3: 25.6 msec per loop
~> python3 -m timeit -s 'l = (None,) * 1000000' 'for x in enumerate(l): pass'
10 loops, best of 3: 38.9 msec per loop

Y el resultado es consistente, siempre que domine el costo de manejar ints:

~> python -m timeit -s 'l = list(range(1000000))' 'map(int,l)'
10 loops, best of 3: 83 msec per loop
~> python -m timeit -s 'l = list(range(1000000))' 'map(int,l)'
10 loops, best of 3: 84 msec per loop
~> python3 -m timeit -s 'l = list(range(1000000))' 'list(map(int,l))'
10 loops, best of 3: 136 msec per loop
~> python3 -m timeit -s 'l = list(range(1000000))' 'list(map(int,l))'
10 loops, best of 3: 136 msec per loop



2014-05-29 16:29 GMT-03:00 Facundo Batista <facundobatista en gmail.com>:
> 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
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar


More information about the pyar mailing list