# [Numpy-discussion] About speed vs math...

Daπid davidmenhur at gmail.com
Mon Jun 3 06:15:33 EDT 2013

```On 3 June 2013 08:33, David Cournapeau <cournape at gmail.com> wrote:
> (around 50 on my own machine, but that's platform
> specific).

In my machine, it is around 10. You also have to be aware of the data
container: it is not the same to iterate over lists than over arrays.

In [6]: a = np.arange(50)

In [7]: %timeit np.sin(a)
100000 loops, best of 3: 3.95 us per loop

In [8]: %timeit np.array([math.sin(i) for i in a]) # We are working
with arrays, we keep the array output.
10000 loops, best of 3: 32.9 us per loop

In [9]: %timeit [math.sin(i) for i in a]    # Keep the list output.
10000 loops, best of 3: 21.3 us per loop

But, if you stick to lists:

In [12]: b = range(50)

In [13]: %timeit [math.sin(i) for i in b]
100000 loops, best of 3: 12.4 us per loop

In any case, switching between iterators and numpy functions is, in my
opinion, error prone. I would use math only for scalars, and numpy for
the rest, except if optimisation is needed (as a last step). For the
record, another interesting example:

In [18]: a = np.arange(10)

In [19]: b = range(10)

In [20]: %timeit a + b                              ## Mixed container
100000 loops, best of 3: 10.4 us per loop

In [21]: %timeit [i + j for i, j in zip(a, b)]
100000 loops, best of 3: 12 us per loop

In [22]: %timeit a + a                               ## Pure array
1000000 loops, best of 3: 1.23 us per loop

In [23]: %timeit [i + j for i, j in zip(a, a)]
100000 loops, best of 3: 7.21 us per loop

In [24]: %timeit b + b                              ## Pure list
1000000 loops, best of 3: 197 ns per loop ## OOOOPS

In [25]: %timeit [i + j for i, j in zip(b, b)]
100000 loops, best of 3: 1.68 us per loop

Here, b + b is just attaching the lists, not adding them. In a
program, that may be an error due to forgotten conversion.

Out of curiosity, VPython, a visual package oriented to beginners, has
its own functions that redirect to math if applied on scalars and to
numpy otherwise.

David.

```