繁体   English   中英

用cython创建矩阵的有效方法

[英]An efficient way to create a matrix with cython

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

编辑:我已更改或添加

des = np.zeros([n-m+1,m])cdef np.ndarray des = np.zeros([n-m+1,m], dtype=DTYPE) (这比np.empty...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一样使它更具体。 您还可以关闭边界检查。 查看cython numpy教程

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

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和不使用-ffast-math来看看是否有所不同。 对于大型数组和矩阵,使用较小的数据类型通常可以显着提高速度,前提是较小的数据类型可以保留程序所需的范围和精度,尽管我认为这种计算没有很大的潜在收益。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM