我仅使用 log.append(line) 在当前最后 1000000 个条目的列表中维护日志。为了确保当大小达到 2000000 时它不会变得太长,我复制了 do log = log[1000000:] 。然而,这是相当缓慢的。
在 CI 中可以使用链表将指针移动到日志中间的位置。但是,这不是一个很好的解决方案,因为我不能再快速跳转到日志中的特定条目。
是否有一个 python 解决方案可以让我在任何我想要的地方截断日志,将内容添加到日志的末尾,但仍然允许快速访问 log[i] ?
我仅使用 log.append(line) 在当前最后 1000000 个条目的列表中维护日志。为了确保当大小达到 2000000 时它不会变得太长,我复制了 do log = log[1000000:] 。然而,这是相当缓慢的。
在 CI 中可以使用链表将指针移动到日志中间的位置。但是,这不是一个很好的解决方案,因为我不能再快速跳转到日志中的特定条目。
是否有一个 python 解决方案可以让我在任何我想要的地方截断日志,将内容添加到日志的末尾,但仍然允许快速访问 log[i] ?
您可以使用collections.deque
:
双端队列支持从双端队列的任一侧进行线程安全、内存高效的追加和弹出操作,在任一方向上的O(1)性能大致相同
对于 py2.6 之前的 python 版本:
附加长度检查时,如果长度大于 1000000,则执行 apopleft
删除最左侧的项目,以便列表始终包含最后一个1000000
项目。
如果您的 python 版本在 py2.6+ 中,那么只需利用maxlen
参数:
如果未指定maxlen或为 None,则双端队列可能会增长到任意长度。否则,双端队列限制为指定的最大长度。一旦有界长度的双端队列已满,当添加新项目时,相应数量的项目将从另一端丢弃。有界长度双端队列提供类似于 Unix 中的尾过滤器的功能。它们还可用于跟踪仅关注最近活动的事务和其他数据池。
您可以使用deque
标准库中的 , :
http://docs.python.org/2/library/collections.html#collections.deque
它支持固定的最大长度,这可能会自动执行您正在寻找的文档:
如果
maxlen
未指定或为 None,则双端队列可能会增长到任意长度。否则,双端队列限制为指定的最大长度。一旦有界长度的双端队列已满,当添加新项目时,相应数量的项目将从另一端丢弃。
看看 NumPy http://www.numpy.org:它包括,除其他外,“一个强大的 N 维数组对象......除了其明显的科学用途外,NumPy 还可以用作高效的多维通用数据的容器。”
list.pop(0) 有什么问题?即当你达到一定长度时,而不是 log.append(l)
你做
log.append(line)
log.pop(0)
当然,这不会截断到特定的大小,而是将列表保持在有限的大小。