python 深拷贝deepcopy效率低及提速方法

deepcopy是对对象的引用的引用对象都进行递归copy,为了防止递归溢出,deepcopy会记录每次已经copy的对象,所以增加了存储操作复杂度,从而影响执行效率。
提速方法:
1.采用pickle模块进行序列化和反序列化

import copy
import pickle
import timeit


class A:
   def __init__(self):
       self.array = [1,2,3]

def cp():
    a = A()
    for i in range(1000):
        newa = a
        # print(a.array)

def dcp():
    a = A()
    for i in range(1000):
        newa = copy.deepcopy(a)

aa = A()
print("aa id:",id(aa))
newaa = pickle.loads(pickle.dumps(aa))
print("newaa id:",id(newaa))
print("newaa == aa:",newaa == aa)
print("newaa is aa:",newaa is aa)

def pdcp():
    a = A()
    for i in range(1000):
        newa = pickle.loads(pickle.dumps(a))


print("浅拷贝:",timeit.timeit(cp,number=100))
print("深拷贝:",timeit.timeit(dcp,number=100))
print("pickle深拷贝:",timeit.timeit(pdcp,number=100))


运行结果:
aa id: 4502219408
newaa id: 4502446320
newaa == aa: False
newaa is aa: False
浅拷贝: 0.0039046590027282946
深拷贝: 1.7970968570007244
pickle深拷贝: 0.6165953849995276

2.重新类的deepcopy方法,将需要copy的熟悉进行copy

import copy
import pickle
import timeit


class A:
    def __init__(self,b=9):
       self.array = [1,2,3]
       self.b = b


    def __deepcopy__(self, memodict={}):
        info = A()
        info.b = self.b
        return info


def cp():
    a = A(8)
    for i in range(1000):
        newa = a
        # print(a.array)

def dcp():
    a = A(7)
    for i in range(1000):
        newa = copy.deepcopy(a)

aa = A(6)
print("aa id:",id(aa))
newaa = pickle.loads(pickle.dumps(aa))
print("newaa id:",id(newaa))
print("newaa == aa:",newaa == aa)
print("newaa is aa:",newaa is aa)

def pdcp():
    a = A()
    for i in range(1000):
        newa = pickle.loads(pickle.dumps(a))


print("浅拷贝:",timeit.timeit(cp,number=100))
print("深拷贝:",timeit.timeit(dcp,number=100))
print("pickle深拷贝:",timeit.timeit(pdcp,number=100))

运行结果
aa id: 4491197240
newaa id: 4491429648
newaa == aa: False
newaa is aa: False
浅拷贝: 0.004788939004356507
深拷贝: 0.34800701800122624
pickle深拷贝: 0.6838125559952459

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值