用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

尝试:

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

你也可以使它更具体,就像你对参数s所做的那样。你也可以关闭边界检查。查看cythonnumpy教程。

您可能还想创建一个变量:

cdef int m_2 = m/2

在任何有m/2的地方使用因为我不知道Cython是否会为你做这个优化

使用np.empty而不是np.zeros可能也有帮助,假设您将为每个元素分配:

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

我没有看到m被设置在任何地方。在代码的末尾,您提到n~10,000, m=1001。这是否意味着m是一个32位的常数整数?没有看到编译标志,通常值得尝试使用和不使用-ffast-math,看看是否有区别。对于大型数组和矩阵,使用较小的数据类型通常会显示出显著的加速,前提是较小的数据类型保留了程序所需的范围和准确性,尽管我没有看到这种计算有很大的潜在好处。

如果你能给我们看一下由它生成的C代码,那可能也会有帮助。

相关内容

  • 没有找到相关文章

最新更新