Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cython sum v/s mean memory jump

I have been trying to work with Cython and I encountered the following peculiar scenario where a sum function over an array takes 3 times the amount of time that the average of an array takes.

Here are my three functions

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

Here are the run times in 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

I am unable to account for the memory jump in simple cython_sum. Is it because of some memory allocation? Since these are random nos from 0 to 1. The sum is around 500K.

Since line_profiler doesn't work with cython, I was unable to profile my code.

like image 556
Richie Abraham Avatar asked Jun 17 '14 18:06

Richie Abraham


1 Answers

It seems like the results from @nbren12 are the definite answer: these results cannot be reproduced.

The evidence (and logic) point out that both methods have the same runtime.

like image 186
rodrigob Avatar answered Oct 07 '22 04:10

rodrigob