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