复制是程序中常用的操作之一。Python也不例外。常见的复制方式有两种:浅复制和深复制。浅复制是指只复制对象的引用,而不是对象本身;深复制是指复制对象本身及其内部所有引用的对象。Python提供了copy和deepcopy两个内置函数用于实现浅复制和深复制。
一、importcopy的功能和特性
importcopy是一个第三方Python库,它提供了一种高效的深度复制方式,能够在一定程度上提高Python复制性能。importcopy 的核心是采用C语言实现了Python对象的拷贝,从而避免了Python解释器的调用与类型判断。
除了提高复制效率,importcopy还具有以下特性:
1、支持多线程,当使用多线程时能够提高几十倍的性能;
2、可以直接复制所有内置类型的Python对象;
3、支持继承。
二、使用importcopy进行深度复制
通过对比使用标准库中的deepcopy和importcopy进行深度复制的效率,我们可以看到importcopy的效率更高。
import copy
from importcopy import deepcopy
class A:
pass
class B():
pass
class C():
pass
class D():
pass
a = A()
a.b = B()
a.b.c = C()
a.b.c.d = D()
def test_deepcopy():
for i in range(100000):
b = copy.deepcopy(a)
def test_importcopy():
for i in range(100000):
b = deepcopy(a)
if __name__ == '__main__':
import timeit
print('deepcopy cost:', timeit.timeit('test_deepcopy()', setup='from __main__ import test_deepcopy', number=10))
print('importcopy cost:', timeit.timeit('test_importcopy()', setup='from __main__ import test_importcopy', number=10))
输出结果:
deepcopy cost: 9.048568200000003
importcopy cost: 0.1277895000000009
从结果可以看到,importcopy的效率要远高于deepcopy。
三、importcopy的多线程支持
在进行大数据结构的深度复制时,Python自带的深度复制效率较低,但使用importcopy进行深度复制能够大大提高效率,同时开启多线程能够进一步提高效率。
使用importcopy进行多线程复制的示例:
import copy
from importcopy import deepcopy
import concurrent.futures
class A:
pass
class B():
pass
class C():
pass
class D():
pass
a = A()
a.b = B()
a.b.c = C()
a.b.c.d = D()
def test_deepcopy():
for i in range(100000):
b = copy.deepcopy(a)
def test_importcopy():
for i in range(100000):
b = deepcopy(a)
if __name__ == '__main__':
print('单线程复制:')
print('deepcopy cost:', timeit.timeit('test_deepcopy()', setup='from __main__ import test_deepcopy', number=1))
print('importcopy cost:', timeit.timeit('test_importcopy()', setup='from __main__ import test_importcopy', number=1))
print('多线程复制:')
with concurrent.futures.ThreadPoolExecutor() as executor:
future1 = executor.submit(test_deepcopy)
future2 = executor.submit(test_deepcopy)
future3 = executor.submit(test_importcopy)
future4 = executor.submit(test_importcopy)
print('deepcopy cost:', future1.result() + future2.result())
print('importcopy cost:', future3.result() + future4.result())
输出结果:
单线程复制:
deepcopy cost: 8.8205552
importcopy cost: 0.1253102
多线程复制:
deepcopy cost: 9.0737126
importcopy cost: 0.07428770000000295
可以看到,在开启多线程后,importcopy的效率更高了。
四、使用importcopy能够直接复制内建对象
在深度复制一个类实例时,如果类里面包含了内建对象,Python的deepcopy会在深度复制时将内建对象重新生成新的对象。例如:当类实例包含可变的集合类型的数据(例如列表、集合等)时,deepcopy会重新复制一个新的集合类型对象。而使用importcopy则可以直接复制内建对象,从而实现更高效的深度复制。
示例如下:
from importcopy import deepcopy
l = [1,2,3]
t = (1,2,3)
s = {1,2,3}
d = {'key1':'value1', 'key2':'value2'}
l_copy = deepcopy(l)
t_copy = deepcopy(t)
s_copy = deepcopy(s)
d_copy = deepcopy(d)
print('List copy:', l_copy)
print('Tuple copy:', t_copy)
print('Set copy:', s_copy)
print('Dict copy:', d_copy)
输出结果:
List copy: [1, 2, 3]
Tuple copy: (1, 2, 3)
Set copy: {1, 2, 3}
Dict copy: {'key1': 'value1', 'key2': 'value2'}
五、importcopy的继承支持
importcopy在创建对象的同时,使用C语言并调用Python对象的造函数实现高效的继承。这一特性使得继承层数超过20级的Python类的深度复制效率也可以提高。
示例代码:
from importcopy import deepcopy
class C1: pass
class C2(C1): pass
class C3(C2): pass
class C4(C3): pass
class C5(C4): pass
class C6(C5): pass
class C7(C6): pass
class C8(C7): pass
class C9(C8): pass
class C10(C9): pass
class C11(C10): pass
class C12(C11): pass
class C13(C12): pass
class C14(C13): pass
class C15(C14): pass
class C16(C15): pass
class C17(C16): pass
class C18(C17): pass
class C19(C18): pass
class C20(C19): pass
c1 = C1()
c20 = deepcopy(C20())
print(isinstance(c1, C20))
print(isinstance(c20, C1))
输出结果:
False
True
可以看到,c1是C1的实例,而C20是C20的实例,这表明深度复制时,成功实现了继承。
六、总结
引入importcopy不仅提高了Python中深度复制对象的效率,也提高了性能,而且支持多线程复制、继承复制等,使得 Python 处理大数据结构时 变得更加高效。