在Cython中访问内存类型的视图很慢

时间:2016-05-30 10:17:24

标签: performance pointers cython typed-memory-views

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

0 个答案:

没有答案