Skip to content Skip to sidebar Skip to footer

Numpy.vectorize: Why So Slow?

The expit function, in scipy.special, is a vectorized sigmoid function. It computes 1 / (1+e^(-x)), which is complicated, probably involving a Taylor series. I learned about the 'f

Solution 1:

I'll just quote the the vectorize docstring: "The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop."

You want to make 1/(1 + abs(x)) fast. numpy has a function called numpy.abs (also called numpy.absolute--they are different names for the same object). It computes the absolute value of each element of its argument, and it does this in C code, so it is fast. Also, the Python built-in function abs knows how to dispatch arguments to objects that have the method __abs__, which numpy arrays do, so you can also use Python's abs() to compute the element-wise absolute value of a numpy array. In the following, though, I'll use np.abs.

Here's an example of the use of np.abs:

In [25]: x = np.array([-2, -1.5, 0, 5, 10])

In [26]: np.abs(x)
Out[26]: array([  2. ,   1.5,   0. ,   5. ,  10. ])

Here's a comparision of the performance of scipy.special.expit and 1.0/(1 + np.abs(x)) for a large array x:

In [34]: from scipy.special import expit

In [35]: x = np.random.randn(100000)

In [36]: %timeit expit(x)
1000 loops, best of 3: 771 µs per loop

In [37]: %timeit 1.0/(1 + np.abs(x))
1000 loops, best of 3: 279 µs per loop

So 1.0/(1 + np.abs(x)) is quite a bit faster than expit(x).

Post a Comment for "Numpy.vectorize: Why So Slow?"