Re: [Python-es] error de memoria al generar lista de numeros aleatorios uniformes en numpy

2014-04-07 Por tema Jaime Perea
El Domingo, 6 de abril de 2014 16:24:39 AGTUGO escribió:
> Hola a todos,
> hace mucho que no les escribía pero los leo de hace unos añitos,
> 
> Tratando de correr el codigo siguiente me sale MemoryError: cuando uso
> valores de 5e7 o mas de sample size. Estoy generando dos listas de numeros
> aleatorios despues, veo si cumplen una condicion y los que cumplen los
> sumo. Es el clasico programa tratando de calcular pi usando monte-carlo.
> ¿Alguien sabe como hacerle para poder usar samples mas grandes sin que
> ipython llore?
> 
> import numpy as np
> from pylab import plot,show,axis
> 
> size_sample = 1e7
> x = np.random.uniform(0,1,size_sample)
> y = np.random.uniform(0,1,size_sample)

python 2.7.5 en una (k)ubuntu 13.10

python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> size_sample = 1e7
>>>
>>> y = np.random.uniform(0,1,size_sample) 
>>> 
Lo he probado en ipython y en una 12.04 de ubuntu (python 2.7.3), me funciona. 
Finalmente lo he probado en una versión a 32bits y yambién funciona ¿Qué 
plataforma utilizas?

Saludos

--
 Jaime D. Perea Duarte.
 Linux registered user #10472



___
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] error de memoria al generar lista de numeros aleatorios uniformes en numpy

2014-04-07 Por tema Daπid
2014-04-06 23:24 GMT+02:00 AGTUGO :

> size_sample = 1e7
> x = np.random.uniform(0,1,size_sample)
> y = np.random.uniform(0,1,size_sample)
>

Los números aleatorios que generas no son importantes, son solo un medio
para un fin. Escribirlos en disco (Pytables, mmap, swap...) es un gasto
innecesario. La única razón por la que quieres hacerlo en paralelo es para
aprovecharte de la vectorización de Numpy; por tanto sólo tiene sentido
usar tamaños en los que puedas usarlo.

import numexpr as ne
import numpy as np

total_number = 1e8
size_sample = 1e6

condition_true = 0
for _ in xrange(int(np.ceil(total_number / size_sample))):
x = np.random.uniform(0, 1, size_sample)
y = np.random.uniform(0, 1, size_sample)
condition_true += ne.evaluate('sum(abs(x * x + y * y < 1))')

print condition_true / total_number

Numexpr está ahí para paralelizar la expresión y optimizar el acceso a
memoria y la caché de la CPU (útil en este caso, quizá no tanto en otros
más complicados).


/David
___
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/