2

我正在尝试创建一个自定义版本的 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
4

0 回答 0