如何在Cython中创建固定长度,可变的Python对象数组?

我需要有一个python对象数组用于创建一个trie数据结构.我需要一个像元组一样固定长度的结构,像列表一样可变.我不想使用列表,因为我希望能够确保列表的大小正确(如果它开始分配额外的元素,随着trie变大,内存开销会非常快地加起来).有没有办法做到这一点?我尝试创建一个对象数组:

cdef class TrieNode:
    cdef object members[32]

……但是这给了一个错误:

Error compiling Cython file:
------------------------------------------------------------
...
cdef class TrieNode:
    cdef object members[32]
                      ^
------------------------------------------------------------

/Users/jason/src/pysistence/source/pysistence/trie.pyx:2:23: Array element cannot be a Python object

做我想做的最好的方法是什么?

最佳答案
我不知道最好的解决方案,但这是一个解决方案:

from cpython.ref cimport PyObject, Py_XINCREF, Py_XDECREF

DEF SIZE = 32

cdef class TrieNode:
    cdef PyObject *members[SIZE]

    def __cinit__(self):
        cdef object temp_object
        for i in range(SIZE):
            temp_object = int(i)
            # increment its refcount so it's not gc'd.
            # We hold a reference to the object and are responsible for
            # decref-ing it in __dealloc__.
            Py_XINCREF(<PyObject*>temp_object)
            self.members[i] = <PyObject*>temp_object

    def __init__(self):
        # just to show that it works...
        for i in range(SIZE):
            print <object>self.members[i]

    def __dealloc__(self):
        # make sure we decref the members elements.
        for i in range(SIZE):
            Py_XDECREF(self.members[i])
            self.members[i] = NULL

Cython对象是一个自动重新计算的PyObject *.只要您负责重新计算小虫子,您就可以随时滚动自己的PyObject *数组.这可能是非平凡案件的主要问题.

转载注明原文:如何在Cython中创建固定长度,可变的Python对象数组? - 代码日志