dict自 Python 3.6 起保持插入顺序(请参阅此)。
OrderedDict就是为了这个目的而开发的(Python 3.6之前)。
dict从 Python 3.6 开始, or的键顺序是否始终相同OrderedDict?
我想知道我是否可以在我的代码中执行此操作并始终具有相同的行为(除了相等性以及 中的一些扩展方法OrderedDict)但更有效:
if sys.version_info[:2] >= (3, 6):
OrderedDict = dict
else:
from collections import OrderedDict
Run Code Online (Sandbox Code Playgroud)
或者换句话说,对于 Python >=3.6,有什么理由使用OrderedDict?
和OrderedDict都是dict按插入顺序\xc2\xb9 进行迭代的。如果迭代顺序是唯一的决定点,则实际上没有理由使用OrderedDict,特别是在不需要重新排序的情况下。
\n显然,如果需要比较OrderedDict顺序并且dict不可互换。
\n\n或者换句话说,对于 Python >=3.6,有什么理由使用
\nOrderedDict?
这些天基本上OrderedDict是为了什么dict。/基于链表\xc2\xb2,而/基于数组。前者具有更好的弹出/移动/先进先出语义,因为可以从开始/中间删除项目而无需移动其他项目。dequelistOrderedDictdequedictlist
由于数组通常对缓存非常友好,因此链表优势仅在非常大的容器中发挥作用。此外,OrderedDict(与deque) 不同,它的链表语义没有保证,因此它的优点可能不可移植。如果需要许多弹出/移动/FIFO 操作并且基准测试可以比较实践中的OrderedDict性能,则应主要使用。dictOrderedDict
\xc2\xb9这适用于所有当前支持的符合Python语言规范的实现,即自Python 3.6以来的CPython和PyPy。
\nCPython 中的\xc2\xb2OrderedDict仍然保留 O(1) 密钥访问。这是通过还具有“常规”查找表来实现的,使用链接列表来确定项目之间的顺序,并使用查找表来直接访问项目。情况很复杂。