如何在Cython中列出内存视图列表



我的功能在不同尺寸的numpy数组的列表中获取:

def function1(list list_of_numpy_arrays):

现在我正在做:

cdef int[:] a_view = list_of_numpy_arrays[index]

问题是我必须大量次数索引列表,以大大增加时间(10倍(。我正在寻找类似cdef int[:] a[5]的东西,其中我可以拥有一系列内存视图,以便避免索引python列表的开销。

如果有解决方案,我还可以在列表中传递。

def function2(list list_of_lists):

在塞通(Cython(中,您所追求的目标是不可能的。如果您想要表现良好的内容,我可能会创建一个C结构,其中包含来自MemoryView的相关信息,然后使用它。这不是一个非常优雅的解决方案,但与使用MemoryViews的性能相似。我不建议将其变为常见的模式,但是如果您有一个一次性问题,那么您的数据就可以了。

cdef struct FakeMemoryView:
    int* data
    int stride
    int length

如果您准备强迫C连续纪念视图(int[::1](,则可以抛弃stride,因为它是一个。可以使用var.data[i*var.stride]索引数据。在函数开始时,您可以循环循环浏览python列表以创建这些FakeMemoryView s的数组,然后从您的角度使用此数组:

def function1(list list_of_numpy_arrays):
    assert len(list_of_numpy_arrays) == 5
    cdef FakeMemoryView new_list[5]
    # initialize the list
    cdef int[:] mview
    for i in range(5):
        mview = list_of_numpy_arrays[i]
        new_list[i].data = &mview[0]
        new_list[i].stride = mview.strides[0]
        new_list[i].length = mview.shape[0]
    # example access - zero the first lot of data
    for i in range(new_list[0].length):
        new_list[0].data[i*new_list[0].stride] = 0

如果您不知道列表的长度,则需要使用mallocfree自己处理内存。

此解决方案无法处理参考数量阵列 - 因此,在持有FakeMemoryView s时,您不应允许将numpy阵列进行交易。不要将数组存储多于单个函数调用,也不要开始从输入列表中删除数组。

相关内容

  • 没有找到相关文章

最新更新