我正在尝试创建一个自定义版本的 numpy.argmin ,它遍历二维数组并找到最小值(这是一个自定义版本,因为我有一些特定于域的信息 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。
我注意到一维内存类型视图也发生了同样的情况,需要我在迭代之前用指针替换每个视图。
我在我的 pyx 文件的顶部有以下声明,只是为了确保。
# cython: boundscheck=False, wraparound=False, nonecheck=False