加速你的Python程序吧!利用deque进行高效的内存操作

一、什么是deque?

deque是Python标准库collections中的一个模块,是双向队列(double-ended queue)的缩写。双向队列是一种具有队列和栈的性质的数据结构,可以在两端进行元素的插入和删除操作。deque比Python中内置的list容器在两端插入和删除元素有更好的性能表现。

    from collections import deque
    d = deque()
    d.appendleft(1)    # 在队列左边插入元素1
    d.appendleft(2)    # 在队列左边插入元素2
    d.append(3)        # 在队列右边插入元素3
    d.append(4)        # 在队列右边插入元素4
    print(d)           # deque([2, 1, 3, 4])
    print(d.pop())     # 弹出队列右边的元素4
    print(d.popleft()) # 弹出队列左边的元素2
    print(d)           # deque([1, 3])

二、优势在哪里?

deque的内部采用了双向链表(doubly-linked list)的数据结构,支持O(1)时间复杂度的元素插入和删除操作。相比之下,Python内置的list的内部结构是数组(array),在其左边插入或删除元素需要对整个数组进行移动,时间复杂度是O(n)。因此,在要求频繁的在list的头部或尾部进行插入和删除操作时,deque比list的性能会更好。

三、实例演示:deque加速程序运行

下面我们来看一个例子,比较使用deque和list插入和删除元素的时间差异:

    import timeit
    from collections import deque

    def insert_list():
        l = []
        for i in range(10000):
            l.insert(0, i)

    def insert_deque():
        d = deque()
        for i in range(10000):
            d.appendleft(i)

    print('list插入操作:', timeit.timeit('insert_list()', 'from __main__ import insert_list', number=100))
    print('deque插入操作:', timeit.timeit('insert_deque()', 'from __main__ import insert_deque', number=100))

    def delete_list():
        l = list(range(10000))
        for i in range(10000):
            l.pop(0)

    def delete_deque():
        d = deque(range(10000))
        for i in range(10000):
            d.popleft()

    print('list删除操作:', timeit.timeit('delete_list()', 'from __main__ import delete_list', number=100))
    print('deque删除操作:', timeit.timeit('delete_deque()', 'from __main__ import delete_deque', number=100))

结果显示,deque相比list要快得多。在插入操作上,deque的效率是list的132倍;在删除操作上,deque的效率是list的15倍。

四、使用deque进行多线程编程

在多线程编程中,线程的同步和互斥非常重要。deque可以作为线程安全的队列使用,支持线程安全的消费者生产者模式,实现同步和互斥。两个线程可以在同一个deque中生产和消费数据。使用锁可以确保多个线程没有冲突,访问队列的顺序是线程安全的,不会发生数据竞争。

    from collections import deque
    import threading
    import time

    cond = threading.Condition()
    deque_list = deque()

    class Producer(threading.Thread):
        def run(self):
            nums = range(5)
            global deque_list
            with cond:
                for num in nums:
                    deque_list.append(num)
                    print('Produced:', num)
                    time.sleep(1)
                    cond.notify()

    class Consumer(threading.Thread):
        def run(self):
            global deque_list
            with cond:
                while True:
                    if not deque_list:
                        print('Waiting for elements...')
                        cond.wait()
                        print('Notified for elements...')
                    num = deque_list.popleft()
                    print('Consumed:', num)
                    time.sleep(1)

    Producer().start()
    Consumer().start()

上述代码中,我们定义了一个条件锁cond和一个空deque列表deque_list。生产者和消费者各自占用一个线程,在生产数据时使用条件锁进行同步,检查deque_list是否为空,为空的话就调用wait()函数进行等待。在消费数据时也使用条件锁进行同步,当生产者把数据加到deque_list中后调用notify()函数进行通知,消费者能够继续取出数据进行消费。

五、结语

deque是Python标准库中一个强大的数据容器,在需要高效率地进行队列操作时,使用deque可以让程序快速运行。同时,deque作为线程安全的数据容器,可以帮助在多线程编程中实现同步和互斥,有效提高程序运行效率。

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

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

相关推荐

  • Python官网中文版:解决你的编程问题

    Python是一种高级编程语言,它可以用于Web开发、科学计算、人工智能等领域。Python官网中文版提供了全面的资源和教程,可以帮助你入门学习和进一步提高编程技能。 一、Pyth…

    编程 2025-04-29
  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • Python创建分配内存的方法

    在python中,我们常常需要创建并分配内存来存储数据。不同的类型和数据结构可能需要不同的方法来分配内存。本文将从多个方面介绍Python创建分配内存的方法,包括列表、元组、字典、…

    编程 2025-04-29
  • 掌握magic-api item.import,为你的项目注入灵魂

    你是否曾经想要导入一个模块,但却不知道如何实现?又或者,你是否在使用magic-api时遇到了无法导入的问题?那么,你来到了正确的地方。在本文中,我们将详细阐述magic-api的…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • Python代码实现回文数最少操作次数

    本文将介绍如何使用Python解决一道经典的回文数问题:给定一个数n,按照一定规则对它进行若干次操作,使得n成为回文数,求最少的操作次数。 一、问题分析 首先,我们需要了解回文数的…

    编程 2025-04-29
  • Python磁盘操作全方位解析

    本篇文章将从多个方面对Python磁盘操作进行详细阐述,包括文件读写、文件夹创建、删除、文件搜索与遍历、文件重命名、移动、复制、文件权限修改等常用操作。 一、文件读写操作 文件读写…

    编程 2025-04-29
  • Python变量在内存中的存储

    该文章将从多个方面对Python变量在内存中的存储进行详细阐述,包括变量的声明和赋值、变量的引用和指向、内存地址的变化、内存管理机制等。 一、声明和赋值 在Python中,变量声明…

    编程 2025-04-29
  • Python元祖操作用法介绍

    本文将从多个方面对Python元祖的操作进行详细阐述。包括:元祖定义及初始化、元祖遍历、元祖切片、元祖合并及比较、元祖解包等内容。 一、元祖定义及初始化 元祖在Python中属于序…

    编程 2025-04-29

发表回复

登录后才能评论