python numpy cython

python - Cython sum v/s significa salto de memoria



numpy (1)

He estado tratando de trabajar con Cython y encontré el siguiente escenario peculiar en el que una función de suma sobre una matriz toma 3 veces la cantidad de tiempo que toma el promedio de una matriz.

Aquí están mis tres funciones.

cpdef FLOAT_t cython_sum(cnp.ndarray[FLOAT_t, ndim=1] A): cdef double [:] x = A cdef double sum = 0 cdef unsigned int N = A.shape[0] for i in xrange(N): sum += x[i] return sum cpdef FLOAT_t cython_avg(cnp.ndarray[FLOAT_t, ndim=1] A): cdef double [:] x = A cdef double sum = 0 cdef unsigned int N = A.shape[0] for i in xrange(N): sum += x[i] return sum/N cpdef FLOAT_t cython_silly_avg(cnp.ndarray[FLOAT_t, ndim=1] A): cdef unsigned int N = A.shape[0] return cython_avg(A)*N

Aquí están los tiempos de ejecución en ipython

In [7]: A = np.random.random(1000000) In [8]: %timeit np.sum(A) 1000 loops, best of 3: 906 us per loop In [9]: %timeit np.mean(A) 1000 loops, best of 3: 919 us per loop In [10]: %timeit cython_avg(A) 1000 loops, best of 3: 896 us per loop In [11]: %timeit cython_sum(A) 100 loops, best of 3: 2.72 ms per loop In [12]: %timeit cython_silly_avg(A) 1000 loops, best of 3: 862 us per loop

No puedo dar cuenta del salto de memoria en cython_sum simple. ¿Es debido a alguna asignación de memoria? Dado que estos son nos aleatorios de 0 a 1. La suma es de alrededor de 500K.

Ya que line_profiler no funciona con cython, no pude perfilar mi código.