Python DeepCopy

2024/07/20 Python

现象&需求

在调用copy.deepcopy函数时发现,该函数的耗时非常高。虽然python本身不是什么高效率的语言,但是在做算法验证的时候,还是希望他能跟上采集到的传感器数据的播放频率的。

原因分析

在deepcopy的源码实现中,他引入了一个memo容器,用来存储已经拷贝的对象。在某些情况下一个对象的成员有可能指向它自己本身,比如双向链表。如果不将拷贝过的对象存着,那程序将陷入死循环。每次拷贝前,程序都要去memo里检查一下是否已经拷贝过,这就是它慢下来的原因。

解决方案

大部分时候,我们需要拷贝的对象不存在循环引用,这时我们可以为需要进行拷贝操作的对象实现一个__deepcopy__()函数。

class Object(object):
    def __init__(self):
        self.mem_1 = None
        self.mem_2 = None

    def __deepcopy__(self,memodict={}):
        tmp = Object()
        tmp.mem_1 = self.mem_1
        tmp.mem_2 = self.mem_2
        return tmp

if __name__ == "__main__":
    obj_0 = Object()
    obj_1 = obj_0.__deepcopy__()

Search

    欢迎添加我的微信

    闷骚的程序员

    Table of Contents