我只使用log.append(line)来维护当前最近1000000个条目的列表中的日志。为了确保当大小达到2000000时它不会太长,我复制log = log [1000000:]。然而,这是相当缓慢的。
在C中,我可以使用链表将指针移动到日志中间的位置。但是,这不是一个很好的解决方案,因为我无法再快速跳转到日志中的特定条目。
是否有python解决方案允许我在任何地方截断日志,将内容添加到日志的末尾但仍允许快速访问log [i]?
答案 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)
当然,这不会截断到特定大小,而是将列表保持在有限的大小。