我正在尝试创建一个自定义版本的numpy.argmin,它遍历一个2D数组并找到最小值(它是一个自定义版本,因为我有一些特定于域的信息numpy没有,这将导致更快执行)。
我的第一个实现是这样的:
cdef my_argmin(array):
cdef double[:, ::1] mv = array # I know the array is in C-order
cdef int i, j, min_i, min_j
cdef double tmp, min
min = 1e50
for i in range(1000):
for j in range(1000):
tmp = mv[i, j]
if tmp < min:
min, min_i, min_j = tmp, i, j
return (i,j)
这比numpy自己的argmin长两倍。问题在于访问内存视图。这很慢。一旦我添加了一些指示:
cdef double *row_ptr
for i in range(1000):
row_ptr = &mv[i,0]
for j in range(1000):
tmp = row_ptr[j]
表现接近于numpy的argmin。
我注意到1维内存类型视图发生了同样的情况,要求我在迭代之前用指针替换每一个。
我在pyx文件的顶部有以下声明,只是为了确保。
# cython: boundscheck=False, wraparound=False, nonecheck=False