首页 > 编程语言 >Python笔记:基本数据结构(容器)的优化

Python笔记:基本数据结构(容器)的优化

时间:2023-09-29 12:11:07浏览次数:35  
标签:容器 name Python 复杂度 查找 collections 数据结构 字典

列表的性能问题

队列的弹出问题

利用Python的原生语法很难写出一个真正完全能达到 \(O(1)\) 的队列,究其原因是由于 insert 方法的时间复杂度问题:

class queue:
	def __init__(self,q):
		self.q=[]
	def popright(self):
		self.q.pop()
	def appendleft(self,elem):
		self.q.insert(0,elem)

由于Python的底层使用的是数组的数据结构,这就导致在插入数据的时候,必须要让这些数据向右移动一位,这就使得时间复杂度变成了 \(O(1)\) .

如果我们想要实现时间复杂度为 \(O(1)\) 的队列怎么办?可以使用Python官方库的 collections 库。

from collections import deque

利用 pop()popleft()append()appendleft() 就能让时间复杂度实现为 \(O(1)\) 了。

查找性能问题

Python默认的查找是利用 in 关键字,如下:

if i in range(1,10):

这个操作的时间复杂度是多少?很遗憾,Python在列表上是使用线性查找的方式进行查找的,时间复杂度自然就是 \(O(n)\) ,这在列表很大的时候就会出现很麻烦的场面。

为了查找的方便,可以将列表转化为集合再去查找,这样的效果会更好,因为Python的集合底层使用的是哈希表的结构,在查找的时候时间复杂度就变成了 \(O(1)\) .

L = [1,2,3,4,5]
L_Set = set(L)
if i in L_Set

需要注意的是转换成集合的操作实际上也是 \(O(n)\) 的,也就是说仅仅在你需要多次查找的时候才有必要将其转化为集合。

字典的优化

合并操作

利用解包操作可以快速合并两个字典:

l1 = {'foo':1}
l2 = {'boo':2}
dict_inserted = {**l1,**l2}

最终我们得到了两个合并后的字典。
需要注意的是 Python 3.9 及之后的版本有个更好的方案:运算符 | ,使用如下:

{'name':'fool','score':100} | {'name':'student'}    
# 结果为 {'name':'student','score':100}
{'name':'student'} | {'name':'fool','score':100} 
# 结果为 {'name':'fool','score':100}

需要注意的是这个运算符遵循“后来居上”的原则,所以如果有相同的key将会保留后来的值。

有序字典

有序字典是 collections 库中的一个字典加强型容器,它可以保留键的有序性,从而不至于在数据转换的时候打乱顺序。

一个应用就是去重:

from collections import OrderedDict
nums = [10,3,3,4,6,2,7,7,1,4,0]
list(OrderedDict.fromkeys(nums).keys())
# 运行结果为 [10, 3, 4, 6, 2, 7, 1, 0]

传统方法是将列表变为一个集合,但是这样的副作用就是打乱了顺序从而出现顺序问题。

元组的优化

命名元组

Python中的默认元组依靠索引进行调用,但是在元素过多的情况下,索引调用就会变得相当麻烦。这个时候可以利用 collections 库优化:

from collections import namedtuple
namedtuple("Point",["x","y"])
p1 = Point(x=1,y=0)

在实际调用的时候,我们可以像调用方法一样调用属性值:

p1.x

从某种程度上比较像字典,但是它与字典的不同之处在于:

  • 命名元组仍然可以用数字索引取元素,而字典只能用key取元素。
  • 命名元组不可变,它与字典的关系可以理解成元组与列表之间的关系。

标签:容器,name,Python,复杂度,查找,collections,数据结构,字典
From: https://www.cnblogs.com/han-son-xiong/p/17736888.html

相关文章

  • python_day1
    Python0基础操作0.0快捷键ctrl+d复制当前行代码shift+alt+上\下将当前行代码上移或下移ctrl+f搜索0.1字面量0.1.0注释#开头(单行注释)(一般用于对单行代码进行注释)'''多行注释(一般用于对程序文件进行解释)'''0.1.1变量变量值可以记录数据,重复使用0.1.......
  • 浅谈数据结构栈与队列
    栈1.栈的基本概念栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。不能插入和删除的一端为栈底(Bottom)栈顶(top):线性表允许进行插入删除的那一端栈底(bottom):固定的,不允许进行插入和删除的那一端空栈:不含任何元素的......
  • Python之列表
    目标列表的应用场景列表的格式列表的常用操作列表的循环遍历列表的嵌套使用一.列表的应用场景思考:有一个人的姓名(TOM)怎么书写存储程序?答:变量。思考:如果一个班级100位学生,每个人的姓名都要存储,应该如何书写程序?声明100个变量吗?答:列表即可,列表一次性可以存储多个数据。二.列表的......
  • python进度条的实现(time)
    最近有小伙伴留言说想使用python实现进度条的功能,其实python中使用sleep每秒钟输出一部分就很容易的实现了这一类功能。案例一:importtimeforiinrange(20):print("□",end="")time.sleep(1)运行结果:案例二:(实现.........)importtimeforiinrange(20):p......
  • Python数据类型
    基本数据类型Python中有一些常用的基本数据类型,让我们一起来看看各种类型及其用途。整数(int)整数是Python中最基本的数据类型之一,用于表示没有小数部分的整数值。age=25浮点数(float)浮点数用于表示带有小数部分的数值。pi=3.14字符串(str)字符串是一系列字符的序列,可以用来表示文本......
  • 处理不平衡数据的十大Python库
    数据不平衡是机器学习中一个常见的挑战,其中一个类的数量明显超过其他类,这可能导致有偏见的模型和较差的泛化。有各种Python库来帮助有效地处理不平衡数据。在本文中,我们将介绍用于处理机器学习中不平衡数据的十大Python库,并为每个库提供代码片段和解释。 https://avoid.overfi......
  • python: Drawing Canvas
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python311#Datetime:2023/9/2121:28#User:geovindu#Product:PyCharm#Project:EssentialAlgor......
  • python基础:python命令行选项
    一前言安装完python后,通过python关键字我们就可以执行python文件如下pythonxxx.py上面是很常见的在命令行执行py的方式,但其实python关键字后面还可以加上许多可选选项如python-cxxxxxpython-mxxxxx二python关键字后的可选选项python[-bBdEhiIOqsSuvVWx?][-ccom......
  • Mac部署Python语言json模块(Anaconda)
      本文介绍在Mac电脑的Anaconda环境中,配置Python语言中,用以编码、解码、处理JSON数据的json库的方法;在Windows电脑中配置json库的方法也是类似的,大家可以一并参考。  JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于数据的序列化和传输。而Python中的json库,......
  • 结对项目:python开发四则运算的程序
    项目链接软件工程软件工程链接作业要求作业要求的链接作业目标两人用python实现一个自动生成小学四则运算题目的命令行程序github项目链接github项目链接团队成员姓名学号李金强3121004868赵继业31210048901.PSP表格PSP表格通常用......