Python 的 OrderedDict 如何记住插入的元素?
How does Python's OrderedDict remember elements inserted?
OrderedDict
in Python如何记住所有元素的顺序?什么是性能开销?对于像实现 LRU
这样的问题,我发现它非常强大并且实现起来非常简单,但是这里的性能提升是什么?它如何记住第一次插入的键的顺序?
是否使用Dict()
和Double Linked List
来记住下图所示的按键?如果您能用简单的语言而不是分享某种研究论文来传达您的信息,我将不胜感激。
最好的一点是您可以查看 OrderedDict
的源代码以更好地理解它。
它实际上也是在纯 python 中实现的!这意味着您可以复制它、重新定义它,并且通常可以随心所欲地随意改变它,直到您理解它为止。
它确实使用了双向链表,这是在源文件的文档字符串中指定的。掌握 how doubly linked lists work 并通过浏览源代码,您将很好地掌握它的工作原理:
# An inherited dict maps keys to values.
# The inherited dict provides __getitem__, __len__, __contains__, and get.
# The remaining methods are order-aware.
# Big-O running times for all methods are the same as regular dictionaries.
# The internal self.__map dict maps keys to links in a doubly linked list.
# The circular doubly linked list starts and ends with a sentinel element.
# The sentinel element never gets deleted (this simplifies the algorithm).
# Each link is stored as a list of length three: [PREV, NEXT, KEY].
OrderedDict
in Python如何记住所有元素的顺序?什么是性能开销?对于像实现 LRU
这样的问题,我发现它非常强大并且实现起来非常简单,但是这里的性能提升是什么?它如何记住第一次插入的键的顺序?
是否使用Dict()
和Double Linked List
来记住下图所示的按键?如果您能用简单的语言而不是分享某种研究论文来传达您的信息,我将不胜感激。
最好的一点是您可以查看 OrderedDict
的源代码以更好地理解它。
它实际上也是在纯 python 中实现的!这意味着您可以复制它、重新定义它,并且通常可以随心所欲地随意改变它,直到您理解它为止。
它确实使用了双向链表,这是在源文件的文档字符串中指定的。掌握 how doubly linked lists work 并通过浏览源代码,您将很好地掌握它的工作原理:
# An inherited dict maps keys to values. # The inherited dict provides __getitem__, __len__, __contains__, and get. # The remaining methods are order-aware. # Big-O running times for all methods are the same as regular dictionaries. # The internal self.__map dict maps keys to links in a doubly linked list. # The circular doubly linked list starts and ends with a sentinel element. # The sentinel element never gets deleted (this simplifies the algorithm). # Each link is stored as a list of length three: [PREV, NEXT, KEY].