range y uso excesivo de memoria

Miuler miuler en gmail.com
Mie Feb 27 03:22:04 CET 2008


mmm..  ahora me encuentro con xrange, al parecer es la mejor opción:

def repeat2(num):
     for i in xrange(num):
         a = i+i

In [38]: t1 = time.time();jo=repeat2(50000000);t2 = time.time();print t2-t1
11.0853869915

tiene la ventaja de ser tan rapido como range, y sin su desventaja de uso
excesivo de memoria.

Alguien tiene más comentarios?



2008/2/26 Miuler <miuler en gmail.com>:

> Hola de nuevo, encontré una cosa interesante, y es que si hago uso de for
> uno dentro de otro para llegar a la misma cantidad, el uso de memoria, no se
> ve afectado:
>
> def func3():
>     u=0
>     for i in range(1000):
>         for j in range(1000):
>             for k in range(50):
>                 a = k+k
>                 u+=1
>     return u
>
> In [30]: t1 = time.time();jo=func3();t2 = time.time();print t2-t1
> 16.3279149532
>
> In [31]: jo
> Out[31]: 50000000
>
>
> 2008/2/26 Hector Miuler Malpica Gallegos <miuler en gmail.com>:
>
>  Hola amigos, tengo una duda, yo tengo la siguiente función en mi
> > python2.5 (ubuntu 8.04) (para ser más exactos uso ipython 0.8.1-2)
> >
> > def repeat2(num):
> >      for i in range(num):
> >          i = i+i
> >
> > def repeat1(num):
> >      i=0
> >      while i <= num:
> >          i = i+i
> >          i += 1
> >
> >
> > Ejecutando las funciones obtengo el siguiente resultado:
> >
> > In [11]: t1 = time.time();repeat1(50000000);t2 = time.time();print t2-t1
> > 17.0249400139
> >
> > In [12]: t1 = time.time();repeat2(50000000);t2 = time.time();print t2-t1
> > 11.1878969669
> >
> > In [13]: t1 = time.time();repeat1(50000000);t2 = time.time();print t2-t1
> > 16.5229768753
> >
> > In [14]: t1 = time.time();repeat2(50000000);t2 = time.time();print t2-t1
> > 10.8672430515
> >
> >
> > en la función que uso range el tiempo es considerablemente menor, pero
> > es uso de memoria es enorme,
> > a tal punto de casi saturar mi memoria, y al terminar la ejecución
> > prácticamente no libera nada de nada, claro la segunda vez ya no sigue
> > aumentando al final el ipython queda con:
> >
> >
> >   PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
> > 10401 pts/1    S+     0:39      0   987 600112 598004 38.4/usr/bin/python /usr/bin/ipython
> >
> > usa más de 580M de ram,
> >
> > he tratado de usar gc.collect() y no libera nada, luego haciendo una
> > prueba solo con range(50000000) ocurre lo mismo ocupa mucha memoria, como
> > puedo hacer para liberar esa memoria????
> >
> > *que es lo recomendable? el uso de while? pero demora mucho, el uso de
> > range? pero consume mucha memoria y no se como liberarla*
> >
> >
> >
> >   --
> > Hector Miuler Malpica Gallegos <miuler en gmail.com>
> >
>
>
>
> --
>     _\|/_
>     (O-O)
> --oOO-(_)-OOo----------------------------------------
> Hector Miuler Malpica Gallegos
> Universidad Nacional del Callao - Peru
> Escuela de Ingenieria Electronica
>
> usuario registrado #308608




-- 
    _\|/_
    (O-O)
--oOO-(_)-OOo----------------------------------------
Hector Miuler Malpica Gallegos
Universidad Nacional del Callao - Peru
Escuela de Ingenieria Electronica

usuario registrado #308608
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


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