首页 > 解决方案 > 发布 GIL 分配多维数组

问题描述

我需要释放 GIL 以使用并行线程。随着 GIL 的发布,我们可以与 memoryview 交互,但我们不能创建它们,因为它依赖于 Python 解释器的垃圾收集器。我正在编写的代码相当简单,因此手动管理内存应该不是什么大问题。

到目前为止,我看到了两个用于动态分配数组的选项prange。第一种选择是暂时重新获得 GIL 只是为了创建一个 memoryview,然后立即释放它。我不确定这是否允许,以及这会降低性能多少。

另一种选择是声明一个双指针,并在 for 循环中为每一行分配内存。然后以类似的方式释放内存,使用如下方法:

from libc.stdlib cimport malloc, free

cdef int** allocate_array(int N, int M) nogil:
    cdef int **arr = <int**>malloc(N * sizeof(int))
    cdef int i
    for i in range(N):
        arr[i]=<int*>malloc(M * sizeof(int))
    return arr

def void free_array(int** arr, int N) nogil:
    cdef int i
    for i in range(N):
        free(arr[i])
    free(arr)

对于如此常见的事情,这似乎是相当多的代码。此外,我实际上还需要 3 维和 4 维数组,这让情况变得更糟。

真的没有更简单的方法可以做到这一点吗?我已经阅读了所有相关的 Cython 文档,以及 Smith 的 Cython 书籍,但没有找到任何相关信息。

标签: cython

解决方案


推荐阅读