理解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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java虚拟机内存大小_jvm内存分布

    java虚拟机内存大小_jvm内存分布目录一、虚拟机二、虚拟机组成1.栈栈帧2.程序计数器3.方法区对象组成4.本地方法栈5.堆GCGC案例一、虚拟机​同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。同一个java代码在windows上生成的机器码可能是0101…….,在linux上生成的可能是1100…….

    2022年10月20日
  • 记录关于微信开放平台扫码登录的问题「建议收藏」

    记录关于微信开放平台扫码登录的问题「建议收藏」1、开放平台扫码登录需要snsapi_login权限,此权限需要注册微信开放平台账号并完成交钱认证。2、添加网站应用,并等待审核通过。通过后会分配一个独立的appid和appsecret。3、网站应用的授权回调域名需要严格按照xxx.yyy.zz的顶级域名填写4、开发时的主要问题是redirect_uri这里:   A、此redirect_uri是微信回调域名,是可以接受请求的真实地址  …

  • 编码器计数原理与电机测速原理——多图解析[通俗易懂]

    编码器计数原理与电机测速原理——多图解析[通俗易懂]编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。编码器分类按监测原理分类光电编码器光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器,光电编码器是由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每

  • vbs代码之“电脑系统崩溃”「建议收藏」

    vbs代码之“电脑系统崩溃”「建议收藏」熟练掌握vbs脚本,可以让你…我也不知道。具体操作:新建文本文档,将本段代码复制进入文本,保存;将后缀.txt改为.vbs即可。codeCreateObject(“SAPI.SpVoice”).Speak”你的电脑受到ddos木马攻击,系统严重瘫痪,电脑系统将在三秒后崩溃”setWshShell=WScript.CreateObject(“WScript.Shell”)WScript.Sleep2000CreateObject(“SAPI.SpVoice”).Speak”电脑系统已

  • fastclick.js

    fastclick.js;(function(){‘usestrict’;/***@preserveFastClick:polyfilltoremoveclickdelaysonbrowserswithtouchUIs.**@codingstandardftlabs-jsv2*@copyrightTheFinancia

  • spring boot dubbo配置(上古卷轴5基础整合包)

    SpringBoot整合Dubbo3.0基础配置(dubbo-spring-boot-starter)一、说明众所周知,阿里早已把dubbo捐赠给了Apache,现在dubbo由Apache在维护更新,dubbo也已经成了Apache下的顶级项目。所以本demo项目所依赖的坐标是Apache官方最新的3.0.4坐标。<dependency><groupId>org.apache.dubbo</groupId><artifac

发表回复

您的电子邮箱地址不会被公开。

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