Python 循环缓冲区

循环缓冲区是环形缓冲区的另一个名称。 缓冲区是一种数据结构,它使用单个固定大小的缓冲区,就好像它是端到端连接的一样。

这种结构有助于管理数据流,其中可以在一端不断添加新数据,而可以从另一端删除旧数据。 当缓冲区已满时,新数据将覆盖最旧的数据。


Python 中的高效循环缓冲区

高效的循环缓冲区是一种允许高效插入和删除数据的数据结构。

循环缓冲区通常作为数组实现。 数组头指针指向第一个元素,尾指针指向数组中的最后一个元素。

头指针和尾指针在到达数组末尾时回绕。 插入循环缓冲区是通过递增头指针并将数据写入该位置的数组来完成的。

从循环缓冲区中删除是通过递增尾指针来完成的。 该数据并未从数组中删除,但头指针和尾指针有效地跳过了它。

循环缓冲区是一种高效的数据结构,因为它只需要固定数量的内存。 它也很容易实现。

class Buffer:def __init__(self, size):self.data = [None for i in range(size)]def append(self, x):self.data.pop(0)self.data.append(x)def get(self):return self.databuf = Buffer(4)
for i in range(10):buf.append(i)print(buf.get())

输出:

[None, None, None, 0]
[None, None, 0, 1]
[None, 0, 1, 2]
[0, 1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 5]
[3, 4, 5, 6]
[4, 5, 6, 7]
[5, 6, 7, 8]
[6, 7, 8, 9]

在 Python 中实现循环缓冲区

在 Python 中有很多方法可以实现高效的循环缓冲区。 一种常见的方法是使用 collections.dequeue 对象,该对象旨在有效地支持从队列的前端和后端移除和添加元素。

另一种方法是使用列表并分别跟踪头部和尾部索引。

如果您想知道哪种方法最好,则取决于应用程序的具体要求。 例如,如果元素需要频繁地从缓冲区中添加和删除,并且顺序不是必需的,那么出列方法可能是最好的。

另一方面,如果元素只被添加到缓冲区一次然后多次读出,或者如果顺序是必要的,那么列表方法可能更好。

在 Python 中使用 collections.enqueue 和 collections.dequeue 实现循环队列

首先,我们将使用函数 collections.enqueue 在队列中添加值。 然后,我们可以在循环队列中使用 collection.dequeue 从队列中删除一个元素。

为了理解它的工作原理,让我们看一下 Python 中循环队列的实际例子。

示例代码:

# implememting circular queue in python
class CircularQueue():def __init__(collections, k):collections.k = kcollections.queue = [None] * kcollections.head = collections.tail = -1# this function will insert (Enqueue) an element into the circular queuedef enqueue1(collections, data):if ((collections.tail + 1) % collections.k == collections.head):print("The queue is full\n")elif (collections.head == -1):collections.head = 0collections.tail = 0collections.queue[collections.tail] = dataelse:collections.tail = (collections.tail + 1) % collections.kcollections.queue[collections.tail] = data# this function will delete (dequeue) an element from the circulardef dequeue1(collections):if (collections.head == -1):print("The circular queue is empty\n")elif (collections.head == collections.tail):temp = collections.queue[collections.head]collections.head = -1collections.tail = -1return tempelse:temp = collections.queue[collections.head]collections.head = (collections.head + 1) % collections.kreturn temp# This function is used to print the queuedef printCQueue1(collections):if(collections.head == -1):print("Circular queue is empty")elif (collections.tail >= collections.head):for i in range(collections.head, collections.tail + 1):print(collections.queue[i], end=" ")print()else:for i in range(collections.head, collections.k):print(collections.queue[i], end=" ")for i in range(0, collections.tail + 1):print(collections.queue[i], end=" ")print()obj = CircularQueue(5)# adding data to the queue
for i in range(1, 6):obj.enqueue1(i)print("Display queue")
obj.printCQueue1()# removing data from the queue
print("\nDelete Value:", obj.dequeue1())
print("Delete Value:", obj.dequeue1())print("\nTwo values were deleted from the queue")
print("The new queue has 3 values now")
obj.printCQueue1()

输出:

Display queue
1 2 3 4 5Delete Value: 1
Delete Value: 2Two values were deleted from the queue
The new queue has 3 values now
3 4 5

Python循环缓冲区的优点

在 Python 中处理数据时使用循环缓冲区有很多优点。

  1. 一个优点是它可以用于以先进先出 (FIFO) 方式存储数据。 当您需要按照接收数据的原始顺序处理数据时,这会有所帮助。
  2. 另一个优点是循环缓冲区可以以后进先出 (LIFO) 的方式存储数据。 当您需要以接收数据的相反顺序处理数据时,这会很好。
  3. 此外,循环缓冲区可用于以随机访问方式存储数据。 当您需要快速随机访问数据时,这会很有帮助。

Python循环缓冲区的缺点

在 Python 中使用循环缓冲区有一些缺点。

  1. 首先,不可能随机访问缓冲区中的元素。 这可能会导致难以处理非线性顺序的数据。
  2. 其次,缓冲区的大小是固定的。 如果您需要存储的数据多于缓冲区可以容纳的数据,这可能会导致问题。
  3. 最后,循环缓冲区比其他数据结构更难调试。

总结

Python 循环缓冲区是一种快速高效的数据存储方式。 循环数据缓冲区是一个队列,可以用作容纳单个对象的容器。

当不断添加和删除数据时,例如在视频游戏或音频处理中,通常会使用循环缓冲区。 它可以用单个指针实现,而线性队列需要两个指针。

循环缓冲区可以很容易地扩展到多个队列,允许并发数据访问。

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

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

相关文章

17. 电话号码的字母组合

题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路: 数字对应字母用map(这里不好用),还是用数组映射,因为这里的映射表是个静态的 组合的思想。比如2,3就是需要选两个字母即搜…

TCP详解之流量控制

TCP详解之流量控制 发送方不能无脑的发数据给接收方,要考虑接收方处理能力。 如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。 为了解决这种现象发生,TCP 提…

java 启动参数 springboot idea

一、idea里配置: 在启动application处,选edit Configuration。进入启动配置框。 有VM options(jvm参数),有Program arguments(程序参数)等。 1、VM options 需要以 -D 或 -X 或 -XX 开头&…

一个方法用js生成随机双色球、大乐透

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

【cpp】std::optional

原文地址 Intro float divide(float a, float b) {if (b 0){return ?;}return a / b; }这里以一个除法函数为例&#xff0c;当 b 为 0 的时候&#xff0c;明显是除法的异常&#xff0c;但是怎样把这个状态返回给调用方呢&#xff1f; 常见的方法有如下几种 抛异常&#x…

网络安全深入学习第六课——热门框架漏洞(RCE— Weblogic反序列化漏洞)

文章目录 一、Weblogic介绍二、Weblogic反序列化漏洞历史三、Weblogic框架特征1、404界面2、登录界面 四、weblogic常用弱口令账号密码五、Weblogic漏洞介绍六、Weblogic漏洞手工复现1、获取账号密码&#xff0c;这是一个任意文件读取的漏洞1&#xff09;读取SerializedSystemI…

MySQL性能优化——MYSQL执行流程

MySQL 执行流程1-5如下图。 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。…

【C刷题训练营】第四讲(打好基础很重要)

前言: 大家好&#xff0c;这是c语言刷题训练营的第四讲&#xff0c;打好基础便于对c语言语法与算法思维的提高&#xff0c;感谢你的来访与支持&#xff01; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏…

操作系统基本概念

目录 一、基本概述 二、操作系统的特点 &#xff08;一&#xff09;并发性&#xff08;实质是微观的串行、宏观的并行&#xff09; 1. 对比看&#xff1a;并行性 2. 单核CPU和多核CPU &#xff08;二&#xff09;共享性 &#xff08;三&#xff09;虚拟性 &#xff08;…

BIO AIO NIO 的区别

BIO AIO NIO 是 Java 中用于 I/O 操作的三种不同的编程模型。它们的区别在于它们执行I/O 操作的方式和效率。在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念&#xff1a;同步与异步&#xff0c;阻塞与非阻塞。 同步与异步 同步&#xff1a;同步就是发起一个调用后&#xff…

LeetCode: 高频链表题目总结 - Python

LeetCode:高频链表题目总结 问题描述&#xff1a; LeetCode: 2. 两数相加 , 注意是逆序存储&#xff0c;相加求和LeetCode: 19. 删除链表的倒数第 N 个结点LeetCode: 21. 合并两个有序链表LeetCode: 23. 合并 K 个升序链表LeetCode: 24. 两两交换链表中的节点 &#xff0c;两…

升级OpenSSL并进行编译安装

Packaging (OpenSSL)组件存在安全漏洞的原因是由于当前爆出的Openssl漏洞。 这个漏洞可能会导致泄露隐私信息&#xff0c;并且涉及的机器和环境也有所不同&#xff0c;因此修复方案也会有所不同。 目前&#xff0c;一些服务器使用的Nginx是静态编译OpenSSL&#xff0c;直接将Op…

LeetCode-37-解数独

题目描述&#xff1a;编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&am…

2023陇剑杯

2023陇剑杯初赛WP HW hard_web_1 ​ 首先判断哪个是服务器地址 ​ 从响应包看&#xff0c;给客户端返回数据包的就是服务器 所以确定服务器地址是192.168.162.188​ 再从开放端口来看&#xff0c;长期开放的端口 客户端发送一个TCP SYN包&#xff08;同步请求&#xff…

记一次线上BUG排查过程

1. 线上遇到一个非常奇怪的bug&#xff0c;为一个用户分配业务线类型后&#xff0c;该用户登录时&#xff0c;提示502&#xff0c;但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志&#xff0c;看是否有error&#xff0c;但日志里边这个接口200正常返回…

Django系列:Django的项目结构与配置解析

Django系列 Django的项目结构与配置解析 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132893616 【介…

Nginx配置最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2023/9/18 -- C++/QT

作业 完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两…

【论文阅读 05】图像异常检测研究现状综述

1 图像异常检测任务 图像异常检测任务根据异常的形态可以分为定性异常的分类和定量异常的定位两个类别. 定性异常的分类&#xff1a;整体地给出是否异常的判断&#xff0c;无需准确定位异常的位置。 如图2左上图所示, 左侧代表正常图像, 右侧代表异常图像, 在第1行中,模…

企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…