python - Cython 中的这个声明是什么?cdef PyObject **工人。它是指向指针的指针吗?
问题描述
我正在尝试利用此示例代码中的概念来并行运行一些 Cython 代码,但我似乎无法在 Cython 文档中找到有关此表示法实际含义的任何信息。
cdef FLOAT_t[:] numbers
cdef unsigned int i
cdef INDEX_t n_workers
cdef PyObject **workers
cdef list ref_workers #Here to maintain references on Python side
def __init__(Parent self, INDEX_t n_workers, list numbers):
cdef INDEX_t i
self.n_workers = n_workers
self.numbers = np.array(numbers,dtype=float)
self.workers = <PyObject **>malloc(self.n_workers*cython.sizeof(cython.pointer(PyObject)))
#Populate worker pool
self.ref_workers = []
for i in range(self.n_workers):
self.ref_workers.append(Worker())
self.workers[i] = <PyObject*>self.ref_workers[i]
def __dealloc__(Parent self):
free(self.workers)
该**
符号是否意味着它是指向 PyObject 指针的指针?我知道该<>
符号是为了取消引用指针,这一行也是:
self.workers = <PyObject **>malloc(self.n_workers*cython.sizeof(cython.pointer(PyObject)))
分配未知数量的内存,因为 PyObject 的大小是未知的,直到self.workers
被取消引用的 PyObjects 填充?
解决方案
它不仅是指向指针的PyObject*
指针,还是指向指针数组的第一个元素的PyObject*
指针。
您可以看到它正在分配内存以适应self.n_workers
,大概工作人员是使用 PyObject 派生实现的,因此在内存中您将拥有:
self.workers -> self.workers[0] (PyObject* for 1st worker)
self.workers[1] (PyObject* for 2nd worker)
....
self.workers[N-1] (PyObject* for last worker)
推荐阅读
- django - Django 1.11 Json 模型
- java - 如何在java上生成随机唯一数
- php - 使用带或不带值的 array_flip
- swift - UITapGestureRecognizer:模态视图被另一个视图重叠
- javascript - 如何在 es6 中编写更好的代码来格式化具有数组值的对象
- javascript - 为什么在我的 Babel 预设中添加“es-2015”会导致此基本应用程序中的“未定义导出”?
- javascript - 用 CSS 改变 div 的位置
- mysql - MYSQL:在 FUNCTION 中验证特定格式的输入值
- google-cloud-platform - 将文件传输到 jupyter 目录中的 google 计算引擎实例
- java - 查找私人课程