我有一个为我计算矩阵的函数,但它确实很慢。即使在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
。
答案 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代码,那么这也可能有所帮助。