[英]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~10000
和m=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.