Pickle Cython Class с указателями C

Я пытаюсь написать__reduce__() метод для класса Cython, который содержит указатели на C, но пока нашел очень мало информации о том, как лучше всего это сделать. Существует множество примеров того, как правильно написать__reduce__() метод при использовании массивов NumPy в качестве данных элемента. Я хотел бы держаться подальше от массивов Numpy, так как они, похоже, всегда хранятся в виде объектов python и требуют вызовов и из API-интерфейса python. Я пришел из C фона, поэтому мне очень удобно работать с памятью вручную, используя вызовыmalloc() а такжеfree() и я пытаюсь сохранить взаимодействие Python до абсолютного минимума.

Однако я столкнулся с проблемой. У меня есть необходимость использовать что-то эквивалентноеcopy.deepcopy() в классе, который я создаю, из скрипта Python, где он в конечном итоге будет использоваться. Я обнаружил, что единственный хороший способ сделать это - реализовать протокол pickle для класса, реализовав__reduce__() метод. Это тривиально с большинством примитивов или объектов Python. Однако я абсолютно не понимаю, как это сделать для динамически распределяемых массивов Си. Очевидно, я не могу вернуть сам указатель, так как основная память исчезнет к моменту восстановления объекта, так каков наилучший способ сделать это? Я уверен, что это потребует модификации как__reduce__() метод, а также один или оба из__init__() методы.

Я прочитал документацию по Python о расширении типов расширениянашел здесь а также почти каждый другой вопрос переполнения стека о выборе классов Cython, таких какэтот вопрос.

Сокращенная версия моего класса выглядит примерно так:

cdef class Bin:
    cdef int* job_ids
    cdef int* jobs
    cdef int primitive_data

    def __cinit__(self):
        self.job_ids = <int*>malloc(40 * sizeof(int))
        self.jobs = <int*>malloc(40 * sizeof(int))

    def __init__(self, int val):
        self.primitive_data = val

    def __dealloc__(self):
        free(job_ids)
        free(jobs)

    def __reduce__(self):
        return (self.__class__, (self.primitive_data))

Ответы на вопрос(1)

Ваш ответ на вопрос