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