【python笔记】deque()、list()、heapq主要区别

内部实现

1、deque()

deque是Python中的一个双端队列,位于collections模块中。

数据结构:

deque 是一个双端队列,其内部实现基于一个双向链表

这意味着元素不是连续存储在内存中的,而是分布在多个节点中,每个节点包含元素本身以及指向其前一个和后一个节点的链接。
动态扩容:

虽然 deque 不需要像 list 那样复制整个数组来扩容,但它仍然需要管理链表的节点,并在必要时添加新的节点。然而,这个过程的开销通常比 list 的扩容要小。
随机访问:

与 list 相比,deque 不支持快速的随机访问。访问 deque 中的元素通常需要从头或尾开始遍历链表,直到找到所需的元素,这可能需要O(n)时间复杂度。
插入和删除:

在 deque 的两端添加或删除元素是非常高效的(O(1)),因为只需要修改几个指针即可。

然而,在 deque 的中间插入或删除元素则可能较慢(O(n)),因为需要遍历链表来找到正确的位置,并可能需要移动多个节点。
 

2、list()

数据结构:

list 是一个动态数组,其内部实现基于一个连续的数组

数组的大小可以动态变化,以容纳更多的元素。
内存分配:

当列表需要更多空间时,Python会分配一个新的、更大的数组,并将旧数组的元素复制到这个新数组中。

这个过程称为“扩容”。
随机访问:

由于列表是基于数组的,因此它支持快速的随机访问,即可以在O(1)时间复杂度内通过索引访问列表中的任意元素。
插入和删除:

在列表的末尾添加或删除元素是高效的(O(1)),但在列表的开头或中间插入或删除元素则可能较慢(O(n)),因为需要移动其他元素

3、heapq

heapq是Python中的一个模块;实际上是基于Python的列表(list)实现了一个最小堆,用于维护一组元素的优先队列。

数据结构:heapq 模块提供了一个堆队列算法的实现,它通常使用列表(list)作为底层容器。但是,heapq 并不改变列表的底层数据结构;它只是通过一系列操作(如上浮和下沉)来维护堆的属性。
堆属性:

heapq 实现的是一个最小堆(尽管可以通过一些技巧来实现最大堆),其中父节点的值不大于其子节点的值。

这使得堆顶(列表的第一个元素)始终是最小的元素。
操作:

heapq 提供了如 heappush(向堆中添加元素)、heappop(从堆中移除最小元素)和 heapify(将列表转换成堆)等函数。

这些函数通过维护堆的属性来确保堆的有效性。
性能:

heapq 的性能特点主要体现在其插入和删除操作上。

向堆中添加元素(heappush)和从堆中移除最小元素(heappop)的时间复杂度都是O(log n),其中n是堆中的元素数量。

这是因为这些操作可能需要通过上浮或下沉来调整堆的结构。
 


使用场景

1、deque()

双端队列:

当需要在队列的两端进行频繁的插入和删除操作时,deque是理想的选择。
高效访问两端元素:

deque提供了从两端快速访问元素的能力,这使得它在某些特定场景下(如循环队列)非常有用。
队列和栈的实现:

deque可以作为队列和栈的底层实现,因为它支持从两端添加和删除元素。

2、list()

存储静态数据集:

适用于需要频繁访问元素、但不经常进行插入或删除操作的场景

3、heapq

优先队列:

当需要处理一系列元素,但每次只想处理优先级最高(或最低)的元素时,heapq非常有用。
堆排序:

heapq可以用于实现堆排序算法,这是一种基于比较的排序算法,适用于大数据集的排序。
资源分配:

在资源分配问题中,如内存管理、CPU时间片分配等,heapq可以根据优先级来分配资源。


常用方法

1、deque()与list()

共用方法
append(x)向右侧添加一个元素
pop()从右侧移除并返回一个元素
extend(iterable)从右侧扩展,添加指定迭代器的元素
insert(index,obj) 在指定位置插入一个元素
index(value, [start, [stop]])返回指定值在列表中第一次出现的索引
clear()移除列表中的所有元素,使其长度为0
remove(value)移除列表中第一个出现的指定值
count(value)返回列表中指定值的出现次数
reverse()原地翻转列表中元素
copy()返回一个浅拷贝
deque()专用方法
appendleft(x)向左侧添加一个元素
extendleft(iterable)从左侧扩展deque,通过添加指定迭代器的元素(元素顺序相反)
popleft()从左侧移除并返回一个元素
rotate(n=1)向右旋转deque n个步骤(如果n是负数,则向左旋转)
list()专用方法
sort(key=None, reverse=False)列表中的元素进行排序
注意:deque在两端添加或删除元素时性能更高,而list在列表中间或两端添加元素时性能相对较差,尤其是在列表很大时。

2、heapq

heappush(heap, item)将item项添加到heap中,保持堆属性
heappop(heap)弹出并返回heap中的最小元素(对于小顶堆)。如果堆为空,则会引发IndexError
heappushpop(heap, item)将item推入堆中,然后弹出并返回堆中的最小元素。这个操作比先调用heappush()再调用heappop()更高效
heapreplace(heap, item)弹出并返回堆中的最小元素,同时将item推入堆中。这个操作与先调用heappop()再调用heappush()效果相同,但更高效
heapify(list)将列表list转换成堆。这是通过就地修改列表来完成的,意味着不会创建新列表
nlargest(n, iterable, key=None)返回iterable中n个最大的元素。这通过保持一个大小为n的堆来实现,使得堆的根元素始终是最大的元素之一
nsmallest(n, iterable, key=None)返回iterable中n个最小的元素。与nlargest()类似,但这是为了找到最小的元素
merge(*iterables, key=None, reverse=False) 合并多个已排序的输入为一个已排序的迭代器;这类似于sorted(itertools.chain(*iterables)),但返回的是一个迭代器,并且不会一次性加载所有数据,因此更适合于大数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05_react应用(基于react脚手架)

react应用(基于react脚手架) 一、使用 create-react-app 创建 react 应用1、react 脚手架2、创建项目并启动3、react 脚手架项目结构 二、样式冲突解决方案、 react 插件安装、编码流程1、样式冲突2、vscode 的 react 插件安装3、功能界面的组件化编码流…

单挑ChatGPT模型,AI最强竞争对手来了!

在2024年3月,Anthropic公司发布了最新的Claude 3系列模型,包括Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus三款模型。这些模型在性能上全面超越了之前的版本,并且在多个基准测试上表现出色,被认为是AI技术的一大突破。Claude…

C练手题--Exclusive “or“ (xor) Logical Operator 【8 kyu】

一、原题 链接:Training on Exclusive "or" (xor) Logical Operator | Codewars Exclusive "or" (xor) Logical Operator Overview In some scripting languages like PHP, there exists a logical operator (e.g. &&, ||, and, or, e…

Android源码编译_内置apk

在开发过程中,有一部分apk,我们是需要出厂内置好的,例如输入法、客户定制app等,这里内置分两种,一种是只内置apk,不含apk源码,一种是包含apk源码。 一、如何将apk内置到系统 1、首先将apk放到…

从零开始:scikit-learn决策树分类实战

在这个大数据和人工智能盛行的时代,机器学习已经成为了人们日常生活中不可或缺的一部分。从推荐系统到自动驾驶,背后都有机器学习的身影。今天,我们将一起探索一种简单却强大的机器学习算法——决策树,并使用Python中的scikit-lea…

基于RDMA的nfs服务

背景 ib网卡nfs服务实现简单的存储共享,暂时顶替还未上线的存储设备,同时也解决 单纯的使用scp rsync等不支持rdma协议拷贝无法正确使用ib网络 说明 前提是系统上已配置安装好ib网卡驱动,且ib网络正常使用,配置参考 https://bl…

中国各城市金融科技公司数目数据集(2009-2023年)

金融科技(FinTech)是金融与科技深度融合的产物,它利用大数据、云计算、人工智能、区块链等现代信息技术手段,对传统金融产品、业务、流程及服务模式进行革新,从而实现金融服务效率的提升、风险管理的优化以及客户体验的…

【解决方案】令牌桶限流器(Redis+LUA+Python实现)

1 缘起 系统需要对某些功能做限流,因为,这个功能CPU消耗远高于其他功能,最高可占用100%分配的CPU,导致整个系统无法对外提供服务。 为了保证系统稳定运行,以及缓解CPU高消耗,对这些高CPU消耗的功能做限流处理, 而限流方案有多种:计数器算法、滑动窗口算法、漏桶算法和…

C语言 | Leetcode C语言题解之第389题找不同

题目&#xff1a; 题解&#xff1a; char findTheDifference(char* s, char* t) {int n strlen(s), m strlen(t);int ret 0;for (int i 0; i < n; i) {ret ^ s[i];}for (int i 0; i < m; i) {ret ^ t[i];}return ret; }

【C++设计模式】(三)创建型模式:单例模式

文章目录 &#xff08;三&#xff09;创建型模式&#xff1a;单例模式饿汉式懒汉式饿汉式 v.s. 懒汉式 &#xff08;三&#xff09;创建型模式&#xff1a;单例模式 单例模式在于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。在某些情况下&#xff0…

24.9.1学习心得

VGG&#xff08;Visual Geometry Group&#xff09;网络是由牛津大学视觉几何小组提出的一种卷积神经网络模型&#xff0c;该模型因其在ImageNet大规模视觉识别挑战赛&#xff08;ILSVRC 2014&#xff09;中的优异表现而闻名。VGG模型的特点在于其架构的简单性和一致性&#xf…

XSS 漏洞 - 学习手册

接下来的日子我会按照目录进行笔记的更新&#xff0c;待本模块更新完毕后&#xff0c;删除此条注释。 备注&#xff1a;即使是更新完了&#xff0c;我知道也会有不足&#xff0c;所以会不定期添加或者删除或者优化某些内容&#xff0c;感兴趣的小伙伴可以关注一波。 0x01&#…

通义说【线性代数】线性方程组和线性代数的关系

线性方程组和线性代数之间有非常紧密的关系。事实上&#xff0c;线性方程组是线性代数的一个核心主题&#xff0c;而线性代数提供了解决线性方程组的一系列理论和工具。 线性方程组 线性方程组是由一组线性方程构成的集合&#xff0c;每个方程都表示未知变量的线性组合等于一…

天气数据爬取

目录 历史气象数据获取浏览器访问模拟 历史气象数据获取 主要的python包 requests BeautifulSoup re pandas lxml 浏览器访问模拟 根据浏览器Request-Header参数&#xff0c;让request模拟浏览器行为 import requests from bs4 import BeautifulSoup import re import pandas…

C#线程同步

c#线程同步代码示例 仔细考虑下面这段代码是不是输出0 const int _max 1000000;private int _count 0;void Start(){Task task Task.Run(() >{Decr();});for (int i 0; i < _max; i){_count;}task.Wait();Debug.Log(_count);}void Decr(){for(int i 0; i < _max;…

国内招聘市场发展历程

大数据、人工智能与社交媒体深度融合&#xff0c;传统招聘网站用户粘性低、信息传播效率低、招聘成本开支大、平台运营与宣传成本高昂&#xff0c;返利招聘或许是一种创新性的解决方案。本文将以蜂媒招聘网为例&#xff0c;深入探讨返利招聘模式的社群属性、用户粘度属性及自助…

一个比 Nginx 还简单的 Web 服务器

企业级的 Web 服务器非常多&#xff0c;Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天松哥再给大家介绍一个开源的 Web 服务器&#xff0c;这款服务器具备自动 HTTPS 功能和高度可配置性&#xff0c;它的名字是&#xff1a;Caddy。 Caddy 是一个 Go 编写的 Web 服务器&…

力扣SQL仅数据库(570-579)

570. 至少有5名直接下属的经理 需求&#xff1a; 编写一个解决方案&#xff0c;找出至少有五个直接下属的经理 数据准备&#xff1a; Create table If Not Exists Employee (id int, name varchar(255), department varchar(255), managerId int) Truncate table Employee i…

PyTorch中,动态调整学习率(Learning Rate Scheduling),也可以根据损失函数的损失数值自动调整学习率

在PyTorch中&#xff0c;动态调整学习率&#xff08;Learning Rate Scheduling&#xff09;是一种常用的技术&#xff0c; 用于在训练过程中根据一定的策略调整学习率&#xff0c;以优化模型的训练效果和收敛速度。以下是一些常见的学习率调整策略&#xff1a; 1. **固定步长…

HTML沙漏爱心

目录 写在前面 完整代码 下载代码 代码分析 系列文章 写在最后 写在前面 教你用HTML语言实现炫酷的沙漏爱心,该代码不仅可以用电脑运行,手机、平板也可以直接运行哦。 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><…