Python circular buffer
Here is a simple circular buffer, or ring buffer, implementation in Python. It is a first-in, first-out (FIFO) buffer with a fixed size.
class RingBuffer:
def __init__(self, size):
self.data = [None for i in xrange(size)]
def append(self, x):
self.data.pop(0)
self.data.append(x)
def get(self):
return self.data
buf = RingBuffer(4) for i in xrange(10): buf.append(i) print buf.get()
Here are the results:
[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]
References:
- http://mail.python.org/pipermail/python-dev/2003-April/thread.html#34790
- http://www.wayforward.net/pycontract/examples/circbuf.py
- http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68429
- http://docs.python.org/tut/node7.html#SECTION007120000000000000000
- http://docs.python.org/lib/module-Queue.html
- http://en.wikipedia.org/wiki/Circular_queue
Related posts
- An example using Python's groupby and defaultdict to do the same task — posted 2014-10-09
- python enum types — posted 2012-10-10
- Python data object motivated by a desire for a mutable namedtuple with default values — posted 2012-08-03
- How to sort a list of dicts in Python — posted 2010-04-02
- Python setdefault example — posted 2010-02-09
- How to conditionally replace items in a list — posted 2008-08-22
Comments
how do i print elements of buf.get?
I dont think Id be able to do
print buf.get[0] ?
As a note to those coming here for a circular queue/buffer, you should use collections.deque with the maxlen parameter set.
"Poping" the first element of a list is a slow operation (linear with the lenght of the list), so you should avoid it. For d(ouble)e(nded)ques, it's fast (constant time).