numpy indexing performance

Olaf Dietrich odt at dtrx.de
Tue Mar 21 05:46:17 EDT 2017


Olaf Dietrich <odt at dtrx.de>:
> This is a simplified example of a Monte Carlo
> simulation where random vectors (here 2D vectors,
> which are all zero) are summed (the result is in
> r1 and r2 or r, respectively):
> 
> def case1():
>     import numpy as np
>     M = 100000
>     N = 10000
>     r1 = np.zeros(M)
>     r2 = np.zeros(M)
>     s1 = np.zeros(N)
>     s2 = np.zeros(N)
>     for n in range(1000):
>         ind = np.random.random_integers(N, size=M) - 1
>         r1 += s1[ind]
>         r2 += s2[ind]
> 
> def case2():
>     import numpy as np
>     M = 100000
>     N = 10000
>     r = np.zeros((M, 2))
>     s = np.zeros((N, 2))
>     for n in range(1000): 
>         ind = np.random.random_integers(N, size=M) - 1
>         r += s[ind]
> 
> import timeit
> 
> print("case1:", timeit.timeit(
>     "case1()", setup="from __main__ import case1", number=1))
> print("case2:", timeit.timeit(
>     "case2()", setup="from __main__ import case2", number=1))
> 
> 
> Resulting in:
> 
> case1: 2.6224704339983873
> case2: 4.374910838028882

I should add that I tried this with Python 3.4.2 and with
Python 2.7.0 (on linux, x64), NumPy version 1.8.2; the
performance differences were the same with both Python
interpreters.


> Why is case2 significantly slower (almost by a
> factor of 2) than case1? There should be the same number
> of operations (additions) in both cases; the main
> difference is the indexing.
> 
> Is there another (faster) way to avoid the separate
> component arrays r1 and r2? (I also tried
> r = np.zeros(M, dtype='2d'), which was comparable
> to case2.)


Olaf


More information about the Python-list mailing list