Feeds:
Posts
Comments

Archive for June, 2013

It is a common practice to use loops in programming. Now if you have a lot of big loops, you find python rather slow. A very efficient way is to use the so-called array broadcasting. For an introduction, see this page for example:
http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

The basic concept is to use column and row vectors to compute all intermediate values at the same time resulting in an 2d-array with all results.This way, you can get rid of almost all ordinary Python loops over arrays. The actual loops will be executed by highly optimized C routines instead, with only a small overhead for calling it from inside the Python interpreter. So this should be almost as fast as plain C or Fortran code.

Example: I would like to evaluate the Planck function for N test data sets, each of them cost four times evaluation of the function (for four wavelengths). In an elementary program, one can do it one by one for N times. This costs about 1.831 seconds runtime. Now if I use array broadcasting technique, I can do it within 0.013 seconds, or some 141 times faster !!!  The main trick is shown in the following example:

ordinary loop: This loop should be called N times.

for i in arange(0,num):
param = fplk(frqs[i], temperature)

vectorized loop using array broadcasting: one single run, no loop at all.

frqs_row = frqs[numpy.newaxis]
temp = temperature[:, numpy.newaxis]
output = fplk(frqs_row, temp)

note that the fplk function is identical !

Read Full Post »