我有一个为我计算矩阵的函数,但它真的很慢。即使在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~10000
和m=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代码,那可能也会有帮助。