Pickle Cython Class com ponteiros C

Estou tentando escrever um__reduce__() método para uma classe cython que contém ponteiros C, mas até agora encontraram muito poucas informações sobre a melhor maneira de fazer isso. Existem muitos exemplos de como escrever corretamente um__reduce__() ao usar matrizes numpy como dados do membro. Gostaria de ficar longe das matrizes Numpy, pois elas sempre parecem armazenadas como objetos python e exigem chamadas para e da API python. Eu sou do segundo plano C, por isso estou muito confortável trabalhando com a memória manualmente usando chamadas paramalloc() efree() e estou tentando manter a interação python no mínimo absoluto.

No entanto, encontrei um problema. Eu preciso usar algo equivalente acopy.deepcopy() na classe que estou criando, a partir do script Python, onde será finalmente usado. Eu descobri que a única maneira de fazer isso é implementar o protocolo pickle para a classe implementando um__reduce__() método. Isso é trivial com a maioria dos objetos primitivos ou python. No entanto, estou absolutamente perdido para saber como fazer isso para matrizes C alocadas dinamicamente. Obviamente, não posso devolver o ponteiro em si, pois a memória subjacente desapareceu no momento em que o objeto é reconstruído, então qual é a melhor maneira de fazer isso? Tenho certeza de que isso exigirá modificação de ambos os__reduce__() método, bem como um ou ambos os__init__() métodos.

Eu li a documentação do python sobre tipos de extensão de decapagemencontrado aqui bem como quase todas as outras questões de estouro de pilha sobre a escolha de classes cython, comoessa questão.

Uma versão condensada da minha classe é mais ou menos assim:

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))

questionAnswers(1)

yourAnswerToTheQuestion