Cython求和与均值内存跃升

19 投票
1 回答
904 浏览
提问于 2025-04-18 10:07

我一直在尝试使用Cython,遇到了一个奇怪的情况:对一个数组进行求和的函数所花的时间是计算数组平均值的三倍。

这是我写的三个函数:

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函数中内存使用量的突然增加。这是因为某种内存分配吗?因为这些数是从0到1之间的随机数,求和大约是50万。

由于line_profiler无法与cython一起使用,我无法对我的代码进行性能分析。

1 个回答

1

看起来@nbren12的结果是明确的答案:这些 结果无法重现

证据和推理表明这两种方法的运行时间是一样的。

撰写回答