cython - 对 cython 类使用深度复制函数的问题

标签 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
        self.N = 0      

a = cy_child((1,2))

b = deepcopy(a)

这是错误:
无法pickle _cython_magic_001970156a2636e3189b2b84ebe80443.cy_child对象

如何解决此代码的问题?

最佳答案

正如 hpaulj 在评论中所说,deepcopy 默认情况下使用 pickle 来完成其工作。 Cython cdef classes 过去是不可 pickle 的。 In recent versions of Cython they are where possible (另请参见 http://blog.behnel.de/posts/whats-new-in-cython-026.html )但是对数组进行 pickle 似乎是一个问题(即使没有数组,我也无法让它工作)。

解决办法是自己实现相关功能。我已经完成了__deepcopy__因为它很简单,但您也可以实现 pickle protocol

def __deepcopy__(self,memo_dictionary):
    res = cy_child(self.move)
    res.Q = self.Q
    res.N = self.N
    return res

我怀疑您将来不需要这样做,因为 Cython 改进了他们的 pickle 实现。


关于 memo_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_dictionarydeepcopy 使用来记录已复制的内容,以便它不会永远循环。您不需要自己做太多事情。但是,如果您的 cdef 类包含 Python 对象(包括另一个 cdef 类),您应该像这样复制它:

cdef class C:
    cdef object o
    def __deepcopy__(self,memo_dictionary):
        # ...
        res.o = deepcopy(self.o,memo_dictionary)
        # ...

(即确保它被传递到 deepcopy 的进一步调用)

关于cython - 对 cython 类使用深度复制函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738319/

相关文章:

python - 为什么 pickle 比 np.save 花费的时间长得多?

copy - 繁殖种群。我应该为每个人发送 `deepcopy` 吗?

java - 如何深拷贝一个不规则的二维数组

python - 从 C Windowsx64 调用 Cython 函数

python - 编写 Cython 扩展 : how to access a C struct internal data from Python?

python - 使用 cPickle 仅返回文件中的第一个条目

python - 创建图像数据的pickeled数据文件

java - 如何克隆/复制WeakHashMap? (深拷贝)

python - Cython Numpy 代码并不比纯 python 快

内存 View 中扩展类型的 Cython 开销