理解Python中的RingBuffer环形缓冲区

理解Python中的RingBuffer环形缓冲区ringbufferReferedfromWikipedia,aringbuffer(环形缓冲区orcircularbuffer,circularqueue,cyclicbuffer)isadatastrcturethatusesasingle,fixed-sizebufferasifitwereconnectedend-to-end.Thisstructurelendsitselfeasilytobufferingdatas..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  • ringbuffer

    Refered from Wikipedia, a ring buffer(环形缓冲区 or circular buffer, circular queue, cyclic buffer) is a data strcture that uses a single, fixed-size buffer as if it were connected end-to-end.

    This structure lends itself easily to buffering data streams.

  • buffer

    First, we should know what the “BUFFER” is in computer science.

    According Wikipedia, a data buffer (or just buffer) is a region of a physical memory storage used to temporarily store data while it is being moved from one place to another.

    Typically, the data is stored in a buffer as it is retrieved from an input device or just befor it is sent to an output device.

    However, a buffer may be used when moving data between processes within a computer.

  • LMAX Disruptor 中 ringbuffer

    LMAX是伦敦多元资产交易所的简称,https://www.lmax.com/

    其开源的LMAX Disruptor可以处理数百万订单/秒。ringbuffer是其一大利器。

    ringbuffer用于在不同上下文(线程)间传递数据的buffer。

    ringbuffer是数据(数组内元素的内存地址是连续性存储的)比链表快。

  • Python中实现ringbuffer

    网上相关资料不多。

    1. 自己实现

      refer from

      class RingBuffer:
          def __init__(self, size):
              self.data = [None for i in range(size)]
          
          def append(self, x):
              self.data.pop(0) # remove the last one which index = -1
              self.data.append(x) # add at the index = -1
          
          def get(self):
              return self.data
      
      buf = RingBuffer(4)
      for i in range(10):
          buf.append(i)
          print(buf.get())
      

      Python Cookbook by Alex Martelli, David Ascher 中有一种相对完善的实现:

      class RingBuffer:
          """ class that implements a not-yet-full buffer """
          def __init__(self,size_max):
              self.max = size_max
              self.data = []
      
          class __Full:
              """ class that implements a full buffer """
              def append(self, x):
                  """ Append an element overwriting the oldest one. """
                  self.data[self.cur] = x
                  self.cur = (self.cur+1) % self.max
              def get(self):
                  """ return list of elements in correct order """
                  return self.data[self.cur:]+self.data[:self.cur]
      
          def append(self,x):
              """append an element at the end of the buffer"""
              self.data.append(x)
              if len(self.data) == self.max:
                  self.cur = 0
                  # Permanently change self's class from non-full to full
                  self._ _class_ _ = self._ _Full
      
          def get(self):
              """ Return a list of elements from the oldest to the newest. """
              return self.data
      
      # sample usage
      if _ _name_ _=='_ _main_ _':
          x=RingBuffer(5)
          x.append(1); x.append(2); x.append(3); x.append(4)
          print x._ _class_ _, x.get(  )
          x.append(5)
          print x._ _class_ _, x.get(  )
          x.append(6)
          print x.data, x.get(  )
          x.append(7); x.append(8); x.append(9); x.append(10)
          print x.data, x.get(  )
      
    2. Python模块collections.deque

      class collections.deque([iterable[, maxlen]])

      deque对象返回一个新的双向队列对象。

    3. Python模块pyringbuf

      这个模块在2015年之后就没有更新了

  • References

  1. 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
  2. 并发框架Disruptor译文
  3. disruptor – BlogsAndArticles.wiki
  4. Trisha’s Ramblings
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197760.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • blob视频如何下载_blob加密视频下载

    blob视频如何下载_blob加密视频下载前言网页上有些视频是直接给的视频地址,那么很多浏览器都有插件进行视频下载,比如猎豹浏览器的:浏览器中有些视频是通过blob:https://baike.baidu.com/bf834217-9442-4c98-9ef6-0bd5f3408a4e的形式给出的。blob后面的网址不能直接访问。这是分片段进行加载的。。。比如百度百科搜索中的视频:离子液体这篇博客教你如何下载此类视频。准…

    2022年10月26日
    0
  • 第三单元分支结构

    第三单元分支结构

    2021年9月28日
    52
  • Charle工具详解之实战演练问题分析、https抓包、流量设置、断点配置

    Charle工具详解之实战演练问题分析、https抓包、流量设置、断点配置目录一 问题分析二 https 的抓包 windows 证书的配置 CharlesHttps 代理的配置 MacOS 证书的配置 IOS 证书配置三 Charles 流量设置断点配置主要包含 问题分析 https 抓包弱网测试断点调试一 问题分析分析出前端问题还是后台问题问题描述 测试地址 http ihrm test itheima net login 实施步骤二 https 的抓包 https 不设置证书的时候抓的报文是乱码

    2025年6月9日
    0
  • JAVA操作FTP(FTP工具类)

    JAVA操作FTP(FTP工具类)JAVAFTP操作导入commons-net<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dependency>packagecom.my.ftp.test;importjava.io.File;imp

    2022年6月9日
    43
  • 电力负荷预测三篇综述总结

    电力负荷预测三篇综述总结对前面三篇关于负荷预测的综述论文进行一个总结。

    2022年5月9日
    410
  • vue-router beforeEach钩子

    vue-router beforeEach钩子在使用vue-routerbeforeEach钩子时,你也许会遇到如下问题:源码:router.beforeEach((to,from,next)=&gt;{//判断登录状态简单实例varuserInfo=window.localStorage.getItem(‘token’);if(userInfo){next();…

    2022年6月20日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号