1

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

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

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

4

4 回答 4

2

您可以使用collections.deque

双端队列支持从双端队列的任一侧进行线程安全、内存高效的追加和弹出操作,在任一方向上的O(1)性能大致相同

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

附加长度检查时,如果长度大于 1000000,则执行 apopleft删除最左侧的项目,以便列表始终包含最后一个1000000项目。

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

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

于 2013-07-26T08:08:27.780 回答
2

您可以使用deque标准库中的 , :

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

它支持固定的最大长度,这可能会自动执行您正在寻找的文档:

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

于 2013-07-26T08:09:28.310 回答
0

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

于 2013-07-26T08:03:47.740 回答
0

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

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

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

于 2013-07-26T08:07:24.673 回答