Подтвердить что ты не робот

Cython sum v/s означает скачок памяти

Я пытаюсь работать с Cython, и я столкнулся со следующим своеобразным сценарием, в котором функция суммы над массивом занимает в 3 раза больше времени, в которое принимает среднее значение массива.

Вот мои три функции

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

Вот время выполнения в 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

Я не могу учесть скачок памяти в простом cython_sum. Это из-за некоторого выделения памяти? Так как это случайные nos от 0 до 1. Сумма составляет около 500K.

Так как line_profiler не работает с cython, мне не удалось профилировать мой код.

4b9b3361

Ответ 1

Похоже, что результаты из @nbren12 являются определенным ответом: эти результаты не могут быть воспроизведены.

В доказательстве (и в логике) указывается, что оба метода имеют одно и то же время выполнения.