Cython中的此声明是什么? cdef PyObject **工人它是指向指针的指针吗?

问题描述

我正在尝试利用此sample code中的概念来并行运行一些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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...