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 处理大数据结构时 变得更加高效。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/194085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-02 09:42
下一篇 2024-12-02 09:42

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29

发表回复

登录后才能评论