您的位置:

importcopy——提高python复制性能的神器

复制是程序中常用的操作之一。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 处理大数据结构时 变得更加高效。