为cython类使用deepcopy函数的问题

为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

我最近一直在玩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
        self.N = 0      

a = cy_child((1,2))

b = deepcopy(a)
这就是错误:
不能pickle\u cython\u magic\u 001970156a2636e3189b2b84ebe80443.cy\u子对象


如何解决此代码的问题?

正如
hpaulj
在评论中所说,
deepcopy
在默认情况下使用
pickle
来完成其工作。Cython
cdef类
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

我只研究了与be
numpy
数组相关的
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)
        # ...