用cython创建矩阵的有效方法

时间:2013-03-12 18:40:24

标签: python performance matrix linear-algebra cython

我有一个为我计算矩阵的函数,但它确实很慢。即使在cython中它也运行缓慢,所以我想知道是否可以采取任何措施来增强以下代码。

编辑:我已经改变或添加

des = np.zeros([n-m+1,m])cdef np.ndarray des = np.zeros([n-m+1,m], dtype=DTYPE)(这比np.empty...更快 而不是说m/2我添加了cdef int m2 = m/2,但似乎没有任何帮助。

cimport numpy as np
cimport cython

DTYPE = float
ctypedef np.float_t DTYPE_t

@cython.boundscheck(False)
@cython.cdivision(True)
@cython.wraparound(False)
cpdef map4(np.ndarray[DTYPE_t, ndim=1] s, int m): 

  cdef int n = len(s)
  cdef int i
  cdef int j

  des = np.zeros([n-m+1,m])
  for j in xrange(m):
      for i in xrange(m/2,n-m/2-1):
          des[i-m/2,j] = s[i-j+m/2]

  return des, s, m, n

通常为n~10000m=1001

3 个答案:

答案 0 :(得分:3)

尝试:

cdef np.ndarray des = np.zeros([n-m+1,m])

您也可以像对参数s一样更具体。您也可以关闭边界检查。查看cython numpy tutorial

您可能还想制作一个变量:

cdef int m_2 = m/2

并在你所拥有的m/2处使用它,因为我不知道Cython是否会为你做优化。

答案 1 :(得分:2)

假设您将分配每个元素,使用np.empty代替np.zeros也可能会有所帮助:

des = np.empty([n-m+1,m])

答案 2 :(得分:0)

我没有看到m被设置在任何地方。在代码的底部,你提到n~10,000,m = 1001。这是否意味着m是32位的常数整数?没有看到你的编译标志,经常值得尝试使用和不使用-ffast-math来查看它是否有所作为。对于大型数组和矩阵,使用较小的数据类型通常会显示出显着的加速,前提是较小的数据类型可以保留程序所需的范围和精度,但我没有看到这个计算有很大的潜在好处。

如果您可以向我们展示由此生成的C代码,那么这也可能有所帮助。