可截断循环缓冲区的Python快速数据结构

可截断循环缓冲区的Python快速数据结构,python,performance,Python,Performance,我只是使用log.append(第行)在最近1000000个条目的列表中维护日志。为了确保当大小达到2000000时不会太长,我复制do log=log[1000000:]。然而,这是相当缓慢的 在C语言中,我可以使用链表将指针移动到日志中间的位置。然而,这不是一个很好的解决方案,因为我不能再快速跳转到日志中的特定条目 是否有一种python解决方案允许我在任何地方截断日志,在日志末尾添加内容,但仍然允许快速访问日志[I]?看看NumPy:它包括:,“一个强大的N维数组对象……除了其明显的科学用

我只是使用log.append(第行)在最近1000000个条目的列表中维护日志。为了确保当大小达到2000000时不会太长,我复制do log=log[1000000:]。然而,这是相当缓慢的

在C语言中,我可以使用链表将指针移动到日志中间的位置。然而,这不是一个很好的解决方案,因为我不能再快速跳转到日志中的特定条目


是否有一种python解决方案允许我在任何地方截断日志,在日志末尾添加内容,但仍然允许快速访问日志[I]?

看看NumPy:它包括:,“一个强大的N维数组对象……除了其明显的科学用途外,NumPy还可以用作通用数据的高效多维容器。”

看看NumPy:它包括,“一个强大的N维数组对象……除了其明显的科学用途,NumPy还可以用作通用数据的高效多维容器。”

list.pop(0)有什么问题?即当您达到某个长度时,而不是使用l
og.append(l)

log.append(line)
log.pop(0)

当然,这不会截断到特定的大小,而是将列表保持在一个有限的大小。

list.pop(0)有什么问题?即当您达到某个长度时,而不是l
og.append(l)

log.append(line)
log.pop(0)
当然,这不会截断到特定的大小,而是将列表保持在有限的大小。

您可以使用:

Deques支持线程安全、内存高效的附件和来自 具有大致相同的O(1)性能的德克两侧 在任何方向

对于py2.6之前的python版本:

追加长度检查时,如果长度大于1000000,则执行
popleft
以删除最左边的项目,以便列表始终包含最后的
1000000
项目

如果您的python版本是py2.6+,那么只需利用
maxlen
参数:

如果未指定或未指定maxlen,则DEQUE可能会增长为任意值 否则,deque将限定为指定的最大值 长度。一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目。 有界长度deques提供类似于尾部过滤器的功能 在Unix中。它们还可用于跟踪事务和其他 仅对最近的活动感兴趣的数据池

您可以使用:

Deques支持线程安全、内存高效的附件和来自 具有大致相同的O(1)性能的德克两侧 在任何方向

对于py2.6之前的python版本:

追加长度检查时,如果长度大于1000000,则执行
popleft
以删除最左边的项目,以便列表始终包含最后的
1000000
项目

如果您的python版本是py2.6+,那么只需利用
maxlen
参数:

如果未指定或未指定maxlen,则DEQUE可能会增长为任意值 否则,deque将限定为指定的最大值 长度。一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目。 有界长度deques提供类似于尾部过滤器的功能 在Unix中。它们还可用于跟踪事务和其他 仅对最近的活动感兴趣的数据池


您可以使用标准库中的
deque

它支持一个固定的最大长度,这可能会自动完成您在文档中查找的内容:

如果未指定或未指定
maxlen
,则DEQUE可能会增长为任意值 否则,deque将限定为指定的最大值 长度。一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目


您可以使用标准库中的
deque

它支持一个固定的最大长度,这可能会自动完成您在文档中查找的内容:

如果未指定或未指定
maxlen
,则DEQUE可能会增长为任意值 否则,deque将限定为指定的最大值 长度。一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目


@AshwiniChaudhary也有同样的问题,不是吗?我希望能够快速截断。当长度变为
1000001
时,您希望列表包含
1000001
项还是
1000000
?移动等效的“指针”(例如整数索引)会有什么问题在Python的列表中间?我怀疑正确的循环缓冲区实现会消除这些问题。@AshwiniChaudhary也有同样的问题,不是吗?我希望能够快速截断。当长度变为
1000001
时,您希望列表包含
1000001
项还是
1000000
在Python中,将等效的“指针”(例如整数索引)移动到列表的中间位置会有问题吗?我怀疑正确的循环缓冲区实现会否定这些问题。list.pop是一个
O(N)
operation。list.pop是一个
O(N)
操作。