理解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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • XPS文件转换PDF小工具,集成了界面,方便大家使用

    XPS文件转换PDF小工具,集成了界面,方便大家使用网上有关于XPS转换PDF的工具gxps.exe,由GhostPDL的代码编译而成。但是很不方便使用,需要设置参数,不够直观。所以想出了给它集成一个外壳的想法。 利用C++语言,编写了外壳,调用gxps.exe,可以直接选择需要转换的文件和保存的地址。 完成界面后,感觉大家还需要再下gxps.exe,两个exe看起来很不爽。所以就将exe集成到了外壳程序里。需要转换时释放该文件

    2022年5月25日
    52
  • 编码器原理_编码器使用方法

    编码器原理_编码器使用方法引用LQ的编码器原理1/概述  旋转编码器是用来测量转速的装置。它分为单路输出和双路输出两种。技术参数主要有每转脉冲数(几十个到几千个都有),和供电电压等。单路输出是指旋转编码器的输出是一组脉冲,而双路输出的旋转编码器输出两组相位差90度的脉冲,通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。编码器如以信号原理来分,有增量型编码器,绝对型编码器。 2/原理 增量型编码

    2022年10月1日
    4
  • 梯度下降算法原理及其计算过程

    梯度下降算法原理及其计算过程1 写在前面还记得以前刚开始学习 AI 的时候 遇到了梯度下降算法 一直对很多概念搞不清楚 包括后来很长的一段时间也不是很明白梯度下降的实现原理 看了很多博客文章都是一知半解 总是有很多疑惑不能搞清楚 而且绝大多数的文章都是生涩的数学公式推理 对于像我这样的数学渣渣来说 理解梯度下降的确有难度 所以前段时间又重新回顾了一下梯度下降算法 结合网上不同来源的资料的学习总结 写了这篇博客 希望对同样刚刚接

    2025年12月11日
    2
  • hadoop2.0的datanode数据存储文件夹策略的多个副本

    hadoop2.0的datanode数据存储文件夹策略的多个副本

    2022年1月8日
    42
  • java中高级面试题总结(全面)_java高级面试题大汇总

    java中高级面试题总结(全面)_java高级面试题大汇总参考了网上的面试题,整理了一份面试题的资料。String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?String是字符串常量,后两者是字符串变量。其中,StringBuffer是线程安全的,而StringBuilder是非线程安全的,线程安全会带来额外的开销,所以StringBuilde

    2022年8月21日
    5
  • 图片循环滚动代码详细介绍[通俗易懂]

    图片循环滚动代码详细介绍[通俗易懂]以下是代码片段:                   var rollspeed=10 rolllink2.innerHTML=rolllink1.innerHTML function Marquee(){ if(rolllink2.offsetTop-rolllink.scrollLeftrolllink.scrollLeft-=rolllink1.of

    2022年7月18日
    15

发表回复

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

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