【发布时间】:2016-03-30 06:30:46
【问题描述】:
我正在尝试为包含 C 指针的 cython 类编写 __reduce__() 方法,但到目前为止,关于执行此操作的最佳方法的信息很少。当使用 numpy 数组作为成员数据时,如何正确编写 __reduce__() 方法的示例很多。我想远离 Numpy 数组,因为它们似乎总是存储为 python 对象,并且需要调用和调用 python API。我来自 C 背景,所以我很乐意通过调用 malloc() 和 free() 手动处理内存,并试图将 python 交互保持在最低限度。
但是我遇到了一个问题。我需要在我正在创建的类上使用与 copy.deepcopy() 等效的东西,来自最终将使用它的 Python 脚本。我发现这样做的唯一好方法是通过实现__reduce__() 方法来实现类的pickle 协议。这对于大多数原语或 python 对象来说都是微不足道的。但是,对于如何为动态分配的 C 数组执行此操作,我完全不知所措。显然,我无法返回指针本身,因为在重建对象时底层内存将消失,那么最好的方法是什么?我确信这将需要修改__reduce__() 方法以及__init__() 方法中的一个或两个。
我已经阅读了有关酸洗扩展类型found here 的python 文档,以及关于选择诸如this question 之类的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))
【问题讨论】:
-
我也读过这个问题,但它并不直接适用于 pickling 指向数组的 C 指针。 Cython - converting pointers to arrays into Python objects
-
我认为您需要将数据序列化为 Python
bytes对象。然后使用重建函数(例如stackoverflow.com/a/12647497/1300519)转换回一个 int 数组。我自己还没有设法让这个工作,但我相信这是正确的方法。在我有一个工作示例之前,不要将此作为答案发布。
标签: python pointers cython pickle