cython - 发布 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 书籍,但没有找到任何相关信息。
解决方案
推荐阅读
- r - 使用 dplyr 进行 quasiquotation 的混合输入
- xml - 在 DataWeave 2.0 中删除 XML 标头声明并提供不带前缀的 XML 命名空间
- c# - 如何让所有视图都可以访问共享的 ProgressCircle 控件?
- azure-resource-manager - 子资源中的正确依赖分配似乎不起作用
- ios - UITableViewCell - 将背景设置为渐变以删除(可滑动操作) - Swift 4.2
- c++ - 使用 boost strand 和 std::mutex
- angular - ag-grid cellrenderer:将html标签添加到单元格但不在模板中,而是作为函数的返回值
- sql - T SQL向XML的根节点添加多个新属性
- javascript - 对象搜索键值并删除其中的第一个和最后一个字符
- curl - 重定向后的 cURL PUT