能否在Cython中创建存储Python对象的C数组?
在Cython中创建存储Python对象的C数组
完全可以实现,你想要的写法只需调整语法细节即可,同时要注意相关的内存管理规则:
固定大小的对象数组(编译期确定大小)
如果数组大小是编译期常量,直接用Cython的object[N_MAX]语法就能实现,Cython会自动维护数组中Python对象的引用计数,无需手动管理。示例代码如下:
cdef int N_MAX = 10 # 必须是编译期可确定的常量 class C: pass cdef object f(): return C() cdef void g(unsigned n): cdef object[N_MAX] obj cdef unsigned i # 避免数组越界 if n > N_MAX: n = N_MAX for i in range(n): obj[i] = f()
当数组obj离开作用域时,Cython会自动对每个元素执行引用计数递减操作,避免内存泄漏。
动态大小的对象数组(运行时确定大小)
如果数组大小需要在运行时动态确定,就需要借助C标准库的malloc分配内存,但此时必须手动管理引用计数和内存释放:
from cpython cimport PyObject from libc.stdlib cimport malloc, free class C: pass cdef object f(): return C() cdef void g_dynamic(unsigned n): # 分配存储Python对象指针的C数组 cdef PyObject** obj = <PyObject**>malloc(n * sizeof(PyObject*)) cdef unsigned i # 处理内存分配失败的情况 if not obj: return try: for i in range(n): obj[i] = f() # 手动增加引用计数,确保对象不会被提前回收 Py_INCREF(obj[i]) # 此处可使用数组中的对象 finally: # 手动释放每个对象的引用 for i in range(n): if obj[i] != NULL: Py_DECREF(obj[i]) # 释放数组本身的内存 free(obj)
这种方式需要严格遵循C的内存管理规则,防止内存泄漏或野指针问题。
内容的提问来源于stack exchange,提问作者Sylvain Leroux
相关产品推荐
相关产品推荐

