为cython类使用deepcopy函数的问题
我最近一直在玩Cython以提高速度,但当我尝试使用为cython类使用deepcopy函数的问题,cython,pickle,deep-copy,Cython,Pickle,Deep Copy,我最近一直在玩Cython以提高速度,但当我尝试使用copy.deepcopy()时,出现了一些错误。下面是代码: from copy import deepcopy cdef class cy_child: cdef public: int move[2] int Q int N def __init__(self, move): self.move = move self.Q = 0
copy.deepcopy()
时,出现了一些错误。下面是代码:from copy import deepcopy
cdef class cy_child:
cdef public:
int move[2]
int Q
int N
def __init__(self, move):
self.move = move
self.Q = 0
self.N = 0
a = cy_child((1,2))
b = deepcopy(a)
这就是错误:不能pickle\u cython\u magic\u 001970156a2636e3189b2b84ebe80443.cy\u子对象
如何解决此代码的问题?正如
hpaulj
在评论中所说,deepcopy
在默认情况下使用pickle
来完成其工作。Cythoncdef类
es过去不可酸洗。(另请参见)但酸洗阵列看起来是个问题(即使没有阵列,我也无法使其工作)
解决方案是自己实现相关功能。我已经这么做了,因为它很简单,但是您也可以实现
我猜想,随着Cython改进了pickle实现,您将来不需要这样做
关于
memo\u dictionary
的注释:假设你有
a=[None]
b=[A]
a[0]=B
# i.e. A contains a link to B and B contains a link to A
c = deepcopy(a)
memo\u dictionary
被deepcopy
用来记录已经复制的内容,这样它就不会永远循环。你不需要自己做太多。但是,如果您的cdef
类包含一个Python对象(包括另一个cdef类),您应该像这样复制它:
cdef class C:
cdef object o
def __deepcopy__(self,memo_dictionary):
# ...
res.o = deepcopy(self.o,memo_dictionary)
# ...
(即,确保它被传递到进一步调用
deepcopy
)我只研究了与benumpy
数组相关的deepcopy
(有关memo
参数的问题)。但是对于自定义类,您必须定义\uuu deepcopy\uu
方法。否则,它将使用从基类(object
)继承的一些通用进程cython的
base可能无法实现它。为什么要deepcopy
?实际上,我在这里使用的代码只是主代码的一个基本示例。在主代码中,我有许多变量,包括memoryview
,numpy
数组,以及其他具有大量参数的对象。因此,我认为deepcopy
更适合使用。类cy_child中有很多函数,因此我想使用deepcopy
来使用它的函数。deepcopy
必须知道如何复制实例的所有属性。错误消息表明默认的deepcopy
使用了pickle
,可能通过pickle创建副本,然后取消pickle。这听起来效率很低,但这可能是递归类的所有层的最常用方法。Cython的最新版本显然支持pickle,因此如果升级Cython,它可能会工作。谢谢你DavidW
。我怀疑DavidW是否代表David奇妙!你能解释一下memo\u dictionary
的作用吗?如果可能的话,还可以给我其他的参考链接,这些链接让你想出了这个解决方案。我已经添加了memo\u dictionary
的解释。老实说,我没有使用太多没有链接的引用,但是我添加了一些关于添加pickle支持的链接。谢谢。你真是帮了大忙。我佩服你乐于助人的热情。
cdef class C:
cdef object o
def __deepcopy__(self,memo_dictionary):
# ...
res.o = deepcopy(self.o,memo_dictionary)
# ...