You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:42:13