[Numpy-discussion] python numpy code many times slower than c++

Christopher Barker Chris.Barker@noaa....
Wed Jan 21 11:44:29 CST 2009

Neal Becker wrote:
> I tried a little experiment, implementing some code in numpy 

It sounds like you've found your core issue, but a couple comments:

 > from numpy import *

I'm convinced that "import *" is a bad idea. I think the "standard" 
syntax is now "import numpy as np"

 > from math import pi

numpy already has pi -- I find I never need math, if I'm using numpy.

def db_to_volt (db):
     return 10**(0.05*db)


class ampl (object):
         ampl_interp = linear_interp (vectorize (db_to_volt) (pin), 
db_to_volt (pout))

you shouldn't need to use vectorize here -- db_to_volt already takes 
array input. vectorize could kill performance, in fact.

ampl_interp = linear_interp(db_to_volt(pin), db_to_volt(pout))

should work fine.

also, if you want maximum performance, you can eliminate extraneous 
array creation in functions like that by:

1) using numexpr (see recent posts about it)
2) writing uglier code that explicitly passes in the output arrays:

def db_to_volt (db):
     a = 0.05*db
     np.power(10, a, a)

This will only help for large arrays, and help more for more complex 

A minor style nit:

I found it remarkably hard to read your code because of the spaces 
before the open parens for function calls:

func (arg1, arg2)

It's not just me: PEP 8 makes it very clear:

Whitespace in Expressions and Statements

   Pet Peeves

     Avoid extraneous whitespace in the following situations:

     - Immediately before the open parenthesis that starts the argument
       list of a function call:

       Yes: spam(1)
       No:  spam (1)


I image you've used that style for years for lots of code, but I 
couldn't help myself!


Christopher Barker, Ph.D.

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception


More information about the Numpy-discussion mailing list