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

时间:2013-07-26 08:00:00

标签: python performance

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

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

是否有python解决方案允许我在任何地方截断日志,将内容添加到日志的末尾但仍允许快速访问log [i]?

4 个答案:

答案 0 :(得分:2)

您可以使用collections.deque

  

Deques支持线程安全,内存高效的追加和弹出   双端的两侧具有大致相同的 O(1)性能   在任何一个方向

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

当附加长度检查时,如果长度大于1000000,则执行popleft删除最左侧的项目,以便列表始终包含最后1000000项。< / p>

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

  

如果未指定 maxlen 或为无,则deques可能会增长为任意值   长度。否则,双端队列将限制为指定的最大值   长度。一旦有限长度双端队列已满,当添加新项目时,   从对端丢弃相应数量的项目。   有界长度deques提供类似于尾部过滤器的功能   在Unix中。它们对跟踪交易和其他交易也很有用   只关注最近活动的数据池。

答案 1 :(得分:2)

您可以使用标准库中的deque

http://docs.python.org/2/library/collections.html#collections.deque

它支持固定的最大长度,可以自动执行您要查找的文档:

  

如果未指定maxlen或为无,则deques可能会变为任意值   长度。否则,双端队列将限制为指定的最大值   长度。一旦有限长度双端队列已满,当添加新项目时,   从对端丢弃相应数量的项目。

答案 2 :(得分:0)

看看NumPy http://www.numpy.org:其中包括“强大的N维数组对象......除了明显的科学用途外,NumPy还可以用作高效的多维容器通用数据。“

答案 3 :(得分:0)

list.pop(0)有什么问题?即,当你达到一定的长度,而不是l og.append(l)你做

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

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