list math for version 1.5.2 without Numeric

Fernando Pérez fperez528 at yahoo.com
Tue Nov 27 22:04:00 CET 2001


J.Jacob wrote:

> List comprehension in the later Python versions is fun but i need to
> get this piece of code to run as quickly as possible on Python
> version 1.5.2 and no NumPy available (not allowed to install extra
> things on the computers here alas).
> 
> This is the code as it is now, it works allright but the profiler
> says we spend a lot of time here:
> for j in range(self.nh):
>     sum = 0.0
>     for i in range(self.ni):
>         sum = sum + self.ai[i] * self.wi[i][j]
> 
> the .nh and .ni values are correct
> I have been trying things like
> 
> import operator
> reduce(operator.add, map( operator.mul, ... ))
> 
> but i am not at all used to optimization wizardry so i have no idea
> if i can find a good solution.
> Any expert wants to help ?

Sorry to be blunt, but if you really do need speed (and you seem 
quite adamant about it), you *need* NumPy. This thing executing as a 
python loop will take ages for large matrices, while in NumPy it runs 
as a C loop without tpyechecking at every step. There's simply no 
comparison.

I understand you may have sysadmin limitations, but you must have at 
least a personal directory somewhere (if not, are you editing in 
memory only? :). Just put numpy there, and add the path to sys.path. 
It won't be available system wide but you'll be able to work.

And I'd double check the order of your indices just to be safe: you 
are doing sum_elements(wi_transpose*ai), where wi is a matrix and ai 
a vector. Are you sure you need the transpose? If you do, it will 
cost you even in Numpy to do it. The only fast way out is to write it 
in C where you can write the indices any way you want.

Cheers,

f



More information about the Python-list mailing list