1.Python中的双端队列deque
2.python之collection-deque
3.Python 爬虫进阶篇——diskcahce缓存(二)
4.python的4个quene们
5.python 把列表当作队列使用方法?
6.流畅的Python笔记02——序列
Python中的双端队列deque
Python中deque(双端队列)的实现基于collections模块,提供更高效的两端操作相较于列表。deque操作复杂度为O(1),显著优于列表的O(n)。
了解不同类型的deque操作,以增强编程效率:
1. 快速插入操作
- append():将元素插入右侧。实际量指标源码
- appendleft():将元素插入左侧。
2. 有效删除操作
- pop():从右侧删除元素。
- popleft():从左侧删除元素。
3. 访问元素
- index(ele,start,end):返回指定值的第一个索引。
- insert(i,a):将元素插入指定索引。
- remove():移除首次出现的元素。
- count():计数指定值出现次数。
4. 获取deque大小
- len(dequeue):返回deque长度。
5. 访问前端和后端
- deque[0]:访问前端元素。
- deque[-1]:访问后端元素。
6. 扩展deque内容
- extend(iterable):将多个值添加至右侧。
- extendleft(iterable):将多个值添加至左侧,顺序反转。
- reverse():反转deque元素顺序。
- rotate():按指定数字旋转deque,正数向右旋转,负数向左旋转。
最后,deque的复杂度分析显示其操作效率,特别是验厂系统源码对于需要频繁进行两端操作的场景,deque提供了显著的性能优势。
python之collection-deque
双端队列(deque)是一个双向列表,支持在两端高效地插入和删除元素。相较于普通列表,deque在头部或尾部进行此类操作的时间复杂度为O(1)。使用deque进行队列和栈操作更为高效。
在双端队列中,除了支持列表的append()和pop()方法外,还提供了appendleft()和popleft()方法。这些方法使得在两端插入或删除元素变得更加高效。双端队列在两端的索引访问时间复杂度为O(1),但访问中间元素的时间复杂度为O(n),因此在需要快速随机访问时,应优先使用列表。
双端队列的使用包括extendleft()方法,它通过迭代列表元素,并将元素依次加入到队列的左侧,实现从右侧向左侧填充的效果。此外,deque还支持类似于列表的其他操作,但需要注意的是,使用deque进行切片操作会抛出异常。如果在deque的长度达到maxlen值时尝试使用insert(index, value)方法,可能会抛出异常。这是因为deque在达到最大长度后会自动删除元素以保持队列大小不变,但在指定位置插入元素时,可能无法确定应删除队列的一端。
双端队列提供rotate方法,周期筹码指标源码用于将队列中的元素向左或向右旋转。当参数大于0时,元素从右向左旋转;当参数小于0时,元素从左向右旋转。deque允许在初始化时设置maxlen参数,以限制队列的最大长度,超过该值时队列将自动删除元素。在保持队列大小的同时,可以继续进行追加操作,但使用insert方法时需注意队列长度是否达到maxlen限制。
综上所述,双端队列是一种高效的双向数据结构,适用于需要在两端进行插入和删除操作的场景。在选择使用列表或双端队列时,应根据操作需求和数据访问模式来决定,以获得最佳性能。
Python 爬虫进阶篇——diskcahce缓存(二)
上一篇文章为大家介绍了diskcache的基础用法,本文将继续深入探讨diskcache的更多高级功能。
关于diskcache,它是一种基于SQLite数据库的缓存对象管理方式。SQLite是一个轻量级的基于磁盘的数据库,它不需要单独的服务器进程,并支持SQL查询。在上篇文章的源码截图上,你可以看到一些SQL语句的使用。
diskcache支持使用diskcache.FanoutCache自动分片基础数据库。分片是对数据进行水平分区,可以减少写入时的考试报资源码阻塞。尽管读和写不会互相阻碍,但写入会阻碍其他写入。分片的默认值为8。
以下是一个示例代码:
# 示例代码
在示例中,我们在diskcache_2文件夹中创建了一个具有四个分片和一秒超时的缓存。如果操作耗时超过一秒,它们将尝试中止操作。
那么每一个分片的大小是多少呢?分片的大小都是平均分配的,占总空间的四分之一。diskcache的默认大小为1GB。
diskcache提供了一个collections.deque兼容的双端队列diskcache.Deque。双端队列是堆栈和队列的一般化,可以在前后都可以进行快速访问和编辑,且可持久化,操作比较便捷。
以下是一个示例代码:
# 示例代码
运行结果如下:
Popleft 获取队列最前面的一个元素,pop获取末尾的一个元素;
Appendleft 在队列最开始添加一个元素,append 在末尾添加一个元素;
Extendleft 在队列最开始添加一个数组,extend在末尾添加一个数组;
那么deque的存储位置在哪里?可以使用以下命令查看队列的存储位置:
包括cache也是一个可以使用directory属性查看默认存储的位置;
那么如何指定directory呢?Deque的第二个参数指定存储位置,第一个参数为队列的初始值。或者可以直接指定参数名称,如下:
Index 类似于dict(字典),可持久化,使用也比较便捷。以下是一个示例:
# 示例代码
popitem表示获取最后一个键对值,并且删除,结果如下:
peekitem() 可传递last 参数是否获取最后一个,不会删除原始值;
setdefault(key,erp系统网站源码default) 可以给指定的key值设置默认值,在查找时可以预先设置一个默认值,防止key值不存在而抛出异常。
keys()与values()可以查找所有Index中的key值与value值,然而没有提供判断key值是否存在的方法,但是可以使用setdefault的方法自行封装。
Lock还记得上篇文章中提到的Lock锁吗?先看一下源码:
可以看到这里的锁用的就是cache的add方法的特性,源码中也给出了使用的方式:
从源码上看有一个while 死循环,直到add成功时才会被释放,这里处理的方式不是很好,可能会造成死锁,所以一般情况下,都会添加一个过期的时间,如下:
RLock还有一种RLock锁,与Lock锁的区别是RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。以下是一个示例:
结果是执行成功。
看一下源码:
从源码中可以看出,判断锁的条件是os.getpid()(进程pid)与threading.get_ident()(线程标识符),如果每次acquire时的pid与ident都相同的时,即可成功。那么就可以在相同的进程中无限次数的acquire,但是多少次acquire就得多少次的release,防止死锁。
那么是使用Lock还是RLock呢?这个要具体的看实际情况,并不是谁就一定好。
总结本次推文中介绍了diskcache中FanoutCache缓存分片、双端队列deque、Index、Lock以及RLock。
大家可以在实际中灵活运用,diskcache缓存的优势还是很大的,无需安装其他的模块,并且在文件管理器中能直接查看,还可以利用缓存的一些特性使用多线程的去实现业务等。
但是也是有缺点的,即受制于本地文件系统的限制。每个磁盘每个目录下的文件数量是有限制的,所以需要结合实际情况使用。
python的4个quene们
队列是只允许在一端插入,在另一端删除的线性表。Python标准库提供四种队列实现:collections.deque, queue.Queue, asyncio.Queue, multiprocessing.Queue。
collections.deque是双端队列,两端可编辑,适用于栈和队列实现,具有丰富的操作方法,相比于list,deque在出队和入队时的时间复杂度为O(1),空间复杂度低,且为线程安全。
queue.Queue与asyncio.Queue支持多生产者、多消费者场景,基于deque,提供FIFO、优先级、LIFO队列接口,queue.Queue适于多线程,asyncio.Queue适于协程通信,后者通过返回协程对象执行阻塞接口。
multiprocessing.Queue为多进程队列,线程安全,进程安全,支持put、get操作,底层基于Pipe,使用join_thread、cancel_join_thread、close控制feeder线程行为,适用于多生产者、多消费者进程场景。
collections.deque是基础队列数据结构,queue.Queue面向多线程,asyncio.Queue面向协程,multiprocessing.Queue面向多进程。四种队列各有侧重,满足不同并发场景需求。
python 把列表当作队列使用方法?
5.1.2. 把列表当作队列使用
你也可以把列表当作队列使用,队列作为特定的数据结构,最先进入的元素最先释放(先进先出)。不过,列表这样用效率不高。相对来说从列表末尾添加和弹出很快;在头部插入和弹出很慢(因为,为了一个元素,要移动整个列表中的所有元素)。
要实现队列,使用 collections.deque,它为在首尾两端快速插入和删除而设计。例如:
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
流畅的Python笔记——序列
本文深入介绍了Python的序列类型,包括扁平序列、容器序列、迭代序列、以及空间大小,详细区分了可变序列与不可变序列。容器序列、迭代序列以及空间大小是构成序列的基石,不可变序列在基础上增加了查询方法,而可变序列则在此基础上增加了删改和排序方法。
列表推导和生成器表达式是创建序列的高效方式。列表推导提供了简洁的语法,用于快速生成列表,而生成器表达式则用于创建其他类型的序列。列表推导可生成复数个iter,虽然列表推导方式简洁明了,但在特定情况下使用普通for循环可能更易于阅读。
元组是不可变序列,具备不可变性和值顺序不变性。元组的不可变性不仅意味着值不会改变,还意味着顺序也不会改变。这使得元组在需要记录特定位置数据时特别有用。元组拆包功能方便提取特定位置的数据,同时提供占位符确保正确拆包。
Python中的切片操作提供了对序列数据的重要操作,包括读取和修改数据。多维切片在处理图像或高维数据时特别有用。使用名称标识的切片操作可以实现统一的切片定义,方便在不同序列上应用相同的切片操作。Numpy库提供额外的多维切片支持,并使用省略符号表示不需要额外指定的参数。
Python内置的序列支持加号(+)和乘号(*)操作,无论是可变序列还是不可变序列均适用,但不可变序列进行原位操作时会抛出错误。在Numpy等库中,+和*操作被视为算数运算符,修改原始数组中的值。进行*或+操作时,需要特别注意是操作值还是引用,以防产生严重问题。
在元组中,尝试对元素赋值会引发错误,但元组中存放的列表实际上会被修改。这是由于元组中的元素为列表的引用,因此修改列表实际上修改了元组中的元素。这反映了Python中引用与值的概念。
Python提供了两种排序方式:list.sort()和sorted()。list.sort()在原序列上进行排序,返回值为None;sorted()则创建新序列作为返回值。这两个内置方法均可通过reverse和key参数控制排序方式。对于有序序列的元素查找和插入,bisect模块提供了bisect.bisect和bisect.insort功能。
数组是一种专为处理仅包含同类数值类型数据设计的序列类型,支持所有与可变序列相关的操作,并提供快速存读方法。Python数组不能处理多维数组,其创建方式简便,需指定存储类型。
内存视图(memoryview)提供了一种在不额外创建新数据结构的情况下实现不同数据结构间内存共享的方法。通过指定区域,可以使用不同的方式存读数据,例如以list形式创建序列,然后以Numpy数组形式处理,而无需额外创建数组。
双向队列(deque)是collections模块提供的高效数据结构,用于快速进行队列两端的添加和删除操作。deque类提供了简单的基本操作,满足特定场景的需求。
总结,本文覆盖了Python序列类型的全面内容,从基本概念到高级操作,旨在提供深入理解Python序列知识的途径。掌握这些序列类型和操作将有助于更高效地编写Python代码,并处理各种数据集。
2024-12-23 07:051371人浏览
2024-12-23 05:56106人浏览
2024-12-23 05:44314人浏览
2024-12-23 05:44317人浏览
2024-12-23 04:57955人浏览
2024-12-23 04:561703人浏览
中国消费者报杭州讯记者施本允)浙江杭州消费者常先生在南京出差时在十足便利店购买了两瓶酸奶,付款后便匆匆离开。事后翻看账单时,常先生隐约记起当时货架上摆放有“第二瓶2元”的宣传标识。由于已经离开南京,常
1.怎样为安卓设备编译 LineageOS 操作系统2.让 Waydroid 运行 Android 13 LineageOS20)3.翻译:XDA论坛教程:如何手动编译TWRP Recovery4.A
1.目标检测常用数据集格式目标检测常用数据集格式 我们常需利用标注工具如LabelImg、LabelMe等制作数据集,或使用开源数据集进行目标检测模型训练。这些数据集格式多样,不具一致性,目标检测