Monte Carlo Method and pi
Fernando Perez
fperez528 at yahoo.com
Sun Jul 11 18:00:34 EDT 2004
Dan Christensen wrote:
> Is there a faster way to get Python to compute a sequence of repeated
> operations like this and sum them up?
Since the killer here is the dynamic type checks on the tight loops, until we
get optional static typing in python you'll need C for this. Fortunately,
weave makes this a breeze. Here's your v1() along with a trivially C-fied
version called v2:
#########################################################################
import random
import math
import weave
def v1(n = 100000):
rand = random.random
sqrt = math.sqrt
sm = 0.0
for i in xrange(n):
sm += sqrt(1.0-rand()**2)
return 4.0*sm/n
def v2(n = 100000):
"""Implement v1 above using weave for the C call"""
support = "#include <stdlib.h>"
code = """
double sm;
float rnd;
srand(1); // seed random number generator
sm = 0.0;
for(int i=0;i<n;++i) {
rnd = rand()/(RAND_MAX+1.0);
sm += sqrt(1.0-rnd*rnd);
}
return_val = 4.0*sm/n;"""
return weave.inline(code,('n'),support_code=support)
#########################################################################
Some timing info:
In [74]: run montecarlo_pi.py
In [75]: genutils.timings 1,v1
-------> genutils.timings(1,v1)
Out[75]: (1.4000000000000057, 1.4000000000000057)
In [76]: genutils.timings 10,v2
-------> genutils.timings(10,v2)
Out[76]: (0.13999999999998636, 0.013999999999998635)
In [77]: __[1]/_[1]
Out[77]: 100.00000000001016
A factor of 100 improvement is not bad for a trivial amount of work :) weave is
truly a cool piece of machinery. Just so you trust the values are OK:
In [80]: v1()
Out[80]: 3.1409358710711448
In [81]: v2()
Out[81]: 3.141602852608508
In [82]: abs(_-__)
Out[82]: 0.00066698153736322041
In [83]: 1.0/sqrt(100000)
Out[83]: 0.003162277660168379
The difference is within MonteCarlo tolerances (the usual 1/sqrt(N)).
Note that the above isn't 100% fair, since I'm calling the stdlib rand, a
C-coded simple generator, while v1 calls python's random.py, a Python-coded
Wichmann-Hill one. But still, for tight numerical loops this is pretty typical
of weave's results. Combined with the fact that via blitz, weave gives you
full access to Numeric arrays, it's a bit of a dream come true.
Cheers,
f
More information about the Python-list
mailing list