固定内存地址的Numpy环形缓冲区,允许显著加快Numpy、sigpy、numba和pyFFTW计算速度。
dvg-ringbuffer的Python项目详细描述
DvG U环形缓冲器
{emmpy内存在^emmpy}显著地允许内存小于emmpy} 加速numpy,sigpy,numba&;pyFFTW计算。在
- Github:https://github.com/Dennis-van-Gils/python-dvg-ringbuffer
- PyPI:https://pypi.org/project/dvg-ringbuffer
安装:
^{tt5}$
基于:
https://pypi.org/project/numpy_ringbuffer/ by Eric Wieser.
^{tt6}$ can be used as a drop-in replacement for ^{tt7}$ and provides several optimizations and extra features, but requires Python 3.
当且仅当环形缓冲区完全满时,它才会返回其数组 以单个固定内存地址作为连续C样式numpy数组的数据 环形缓冲区实例。它是通过打开不连续的环形缓冲器来实现的 数组放入第二个额外的unwrap缓冲区,该缓冲区是环的私有成员 缓冲区类。这有利于其他加速计算,例如:。, numpy,sigpy,numba&;pyFFTW,它们可以从中受益 连续数组每次都在同一内存地址,这样编译器 优化和数据规划成为可能。在
当环形缓冲区未完全满时,它将以 连续的C样式numpy数组,但位于不同的内存地址。这是怎么回事 原始的numpy-buffer始终运行。在
通常,collections.deque()用作环形缓冲区。这个 deque的好处是对大多数人来说,它是线程安全且速度(足够)的 情况。然而,每当deque时都会有一个开销,比如 容器–需要转换为numpy数组。因为 DvG_RingBuffer已经返回numpy数组,它的性能将优于 collections.deque()容易,测试为~60的因子。在
警告
- 此环形缓冲区不是线程安全的。你必须实现你自己的 在多线程操作中使用此环形缓冲区时,互斥锁。在
- 一个完整的环形缓冲区返回的数据数组是一个传递函数 unwrap缓冲区的引用。这不是复制品!因此,改变 返回数据数组中的值与更改 unwrap缓冲区。在
RingBuffer(capacity, dtype=np.float64, allow_overwrite=True)
Create a new ring buffer with the given capacity and element type.
- Args:
- capacity (^{tt17}$):
- The maximum capacity of the ring buffer
- dtype (^{tt18}$, optional):
Desired type of buffer elements. Use a type like ^{tt19}$ to produce a buffer with shape ^{tt20}$.
Default: ^{tt21}$
- allow_overwrite (^{tt22}$, optional):
If ^{tt23}$, throw an IndexError when trying to append to an already full buffer.
Default: ^{tt24}$
方法
clear()
在- append(value)
向环形缓冲区追加一个值。在
rb=RingBuffer(3,dtype=np.int)# []rb.append(1)# [1]rb.append(2)# [1, 2]rb.append(3)# [1, 2, 3]rb.append(4)# [2, 3, 4]
- appendleft(value)
从左侧向环形缓冲区追加一个值。在
^{pr2}$
- extend(values)
使用值列表扩展环形缓冲区。在
rb=RingBuffer(3,dtype=np.int)# []rb.extend([1])# [1]rb.extend([2,3])# [1, 2, 3]rb.extend([4,5,6,7])# [5, 6, 7]
- extendleft(values)
使用左侧的值列表扩展环形缓冲区。在
rb=RingBuffer(3,dtype=np.int)# []rb.extendleft([1])# [1]rb.extendleft([3,2])# [3, 2, 1]rb.extendleft([7,6,5,4])# [7, 6, 5]
- pop()
从环形缓冲区中移除最右边的项并将其返回。在
- popleft()
从环形缓冲区中移除最左边的项并将其返回。在
属性
- is_full
- unwrap_address
- current_address
- dtype
- shape
- maxlen
索引和切片
[],包括负指数和切片
在fromdvg_ringbufferimportRingBufferrb=RingBuffer(4,dtype=np.int)# --> rb[:] = array([], dtype=int32)rb.extend([1,2,3,4,5])# --> rb[:] = array([2, 3, 4, 5])x=rb[0]# --> x = 2x=rb[-1]# --> x = 5x=rb[:3]# --> x = array([2, 3, 4])x=rb[np.array([0,2,-1])]# --> x = array([2, 4, 5])rb=RingBuffer(5,dtype=(np.int,2))# --> rb[:] = array([], shape=(0, 2), dtype=int32)rb.append([1,2])# --> rb[:] = array([[1, 2]])rb.append([3,4])# --> rb[:] = array([[1, 2], [3, 4]])rb.append([5,6])# --> rb[:] = array([[1, 2], [3, 4], [5, 6]])x=rb[0]# --> x = array([1, 2])x=rb[0,:]# --> x = array([1, 2])x=rb[:,0]# --> x = array([1, 3, 5])
变更日志
1.0.1(2020-07-21)
- 更新的文档
1.0.0(2020-07-21)
- 关于PyPI的第一次发布
- 项目
标签: