在Python中,我可以提高有限长度deque(循环缓冲区)中的随机访问速度吗?

在Python中,我可以提高有限长度deque(循环缓冲区)中的随机访问速度吗?,python,data-structures,Python,Data Structures,我正在用Python编写一个小的日志清理程序,它处理一个滚动日志文件,并在文件中存储感兴趣的行的偏移量 我最初的解决方案在大文件上运行得相当快,但我没有清除存储的方法,这意味着如果程序继续运行,内存使用将稳步增加,直到程序消耗掉所有可用内存。我的解决方案是将collections.deque与maxlen一起使用,这样列表将作为循环缓冲区运行,当更多日志行进入时丢弃最旧的日志行 虽然这解决了内存问题,但在按索引从deque调用项时,我面临着严重的性能损失。例如,此代码的运行速度比旧版本慢得多,旧

我正在用Python编写一个小的日志清理程序,它处理一个滚动日志文件,并在文件中存储感兴趣的行的偏移量

我最初的解决方案在大文件上运行得相当快,但我没有清除存储的方法,这意味着如果程序继续运行,内存使用将稳步增加,直到程序消耗掉所有可用内存。我的解决方案是将
collections.deque
maxlen
一起使用,这样列表将作为循环缓冲区运行,当更多日志行进入时丢弃最旧的日志行

虽然这解决了内存问题,但在按索引从deque调用项时,我面临着严重的性能损失。例如,此代码的运行速度比旧版本慢得多,旧版本中self.loglines不是deque。有没有办法提高它的速度,或者制作一个循环缓冲区,其中随机访问是一个恒定的时间操作(而不是,我假设,O(n))


与所有的双链表一样,a
collections.deque
中的随机访问是O(n)。考虑使用有界列表的列表,以便清除旧条目(<代码> DEL外[0 ] < /代码>),即使在成百上千条条目中,仍然可以及时进行。

谢谢您的回答!我假设在这种情况下,随机访问是O(n),考虑到速度的减慢——我想知道是否有任何方法可以实现一个循环缓冲区,其中随机访问是O(1)而不是O(n)。如果您的内部列表被限制为1000个条目,那么随机访问条目大约是O(1),但是,如果一次删除1000个条目,则清除旧条目的速度会很快。使用内部有界列表和外部无界列表将摊销为O(1),但我看不出内部列表是有界数据的意义。如果每次我达到1000个条目时,我需要移动到一个新列表,而不是从旧的内部列表中删除任何内容(这里就是这种情况),那么内部列表也可以是用于O(1)查找的数组。无论哪种方式,我都需要跟踪每个数组的长度并手动清除外部列表,因此总的来说,仅仅使用和清除一个大数组似乎不必要地复杂。我从来没有说过内部列表应该是有界的。是的。Deques,否。拥有1000个元素数组的列表和删除第一个数组以及拥有一个大列表和使用一个切片(即
mylist=mylist[1000://code>)删除前1000个元素之间的速度差异是否足够大,足以证明嵌套引入代码的复杂性?我认为切片足够快(当然较慢,但仍然足够)。
    def get_logline(self, lineno):
            """Gets the logline at the given line number.

            Arguments:
            lineno - The index of the logline to retrieve

            Returns: A string containing the logline at the given line number
            """

            start = self.loglines[lineno].start
            end = self.loglines[lineno+1].start
            size = end - start
            if self._logfile.closed:
                    self._logfile = open(self.logpath, "r")
            self._logfile.seek(start)
            logline = self._logfile.read(size)
            return logline