Simple bucle

Chema Cortés ch3m4 en ch3m4.org
Mie Dic 17 10:31:59 CET 2003


nieto_a1 en tsm.es escribió:

>   El  código  java se ejecutaba prácticamente en un segundo, sin embargo el
>   código en python tardaba ocho segundos (en mi portátil, pentium III a 750
>   Mhz  y  128Mb  de  RAM).  Pruebas  en un Solaris 8 daba tiempos relativos
>   similares.
> 
>   Lo que me llama la atención no es lo poco que tarda la versión java, sino
>   el  exceso  de tiempo que emplea python para una tarea, en principio, muy
>   simple.

Aunque ya te han contestado correctamente, quisiera puntualizar que las 
cosas no son lo que parece. Ambos bucles no son la misma cosa. Intenta 
hacer la siguiente prueba más "elaborada", en la que he reducido el 
límite del bucle para que no tarde mucho:

En python:

res=1
for i in xrange(1,2000):
    res*=i

En java (supongo que será):

   class test {
       static void main(String argv[]) {
             for ( int res = 1, int i = 1; i < 2000; res *= i++ ) {
             }
       }
   }

Como se ve, el código java es tan "rápido" que revienta mucho antes que 
el código python X-P

>   He revisado por encima la función xrange en los fuentes de python y me ha
>   parecido  ver que la mayoría del tiempo se gasta en crear los 20000000 de
>   objetos int que hacen falta para el bucle.

'xrange' es, en velocidad, idéntico a la función 'range': se crean 
20000000 enteros en algún momento. La diferencia está en que 'xrange' es 
un iterador, con lo que no hace falta que estén presentes esos 20000000 
objetos ocupando memoria en todo momento.


Por terminar, me parece raro que Francesc no hablara en su respuesta del 
Pyrex (http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/). Esta 
extensión de python incorpora su propia optimización de bucles que los 
aproxima en rendimiento a los hechos en C:

n=20000000
for i from 0 <= i <n:
   pass

Pero bueno, eso es otra historia.


-- 
Res publica non dominetur




Más información sobre la lista de distribución Python-es