[SciPy-user] Vectorize vs Map
Travis Oliphant
oliphant at ee.byu.edu
Fri Mar 16 12:13:45 EDT 2007
lorenzo bolla wrote:
> here is a simple timing on my machine.
>
> ---------------------------------------------------
>
> import scipy as S
> from timeit import Timer
>
> def f(x):
> return S.sqrt(S.absolute(x)**2)
>
> x = S.array(S.rand(1000))
> fv = S.vectorize(f)
> fu = S.frompyfunc(f,1,1)
>
> def test():
> #f(x)
> #fv(x)
> fu(x)
>
> if __name__ == '__main__':
> t = Timer('test()', 'from __main__ import test')
> n = 100
> print "%.2f usec/pass" % (1e6*t.timeit(number=n)/n)
>
>
> ---------------------------------------------------
>
> I get:
> 229.84 usec/pass for f(x)
> 119410.40 usec/pass for fv(x)
> 114513.80 usec/pass for fu(x)
>
> vectorize and frompyfunc create functions roughly 500 times slower
> than the one using ndarrays arithmetics (even if it cannot operate on
> lists, just ndarrays).
>
There is nothing new here. It is not surprising at all. From pyfunc
creates a ufunc out of a python function. The python function is
called at each element-by-element calculation. In this case, the
element-by-element calculation is also using ufuncs to compute the
result (ufuncs are a very slow way to compute a single scalar operation).
Because a Python function is called, the ufunc uses object arrays as well.
All of these intermediate things means the result will be much slower.
Vectorize and frompyfunc are only useful when you want a quick ufunc
that you can't figure out how to vectorize yourself.
If you can vectorize it, it is always better to do it than to use
vectorize.
-Travis
More information about the SciPy-User
mailing list