因为Python3.6字典保持插入/键顺序。
我和一位同事就如何实现这个问题进行了争论。他说,这一定是通过使用列表或其他集合来保持密钥顺序来实现的。我怀疑可能还有更微妙的事情在起作用。
我做了以下比较:
# Python 3.4.3
d = {1: 2, 2:3, 3:4}
od = OrderedDict(d)
print(sys.getsizeof(d)) # 288
print(sys.getsizeof(od)) # 1304
# Python 3.6.3
d = {1: 2, 2:3, 3:4}
print(sys.getsizeof(d)) # 240
OderedDict
的大小是巨大的,我绝对可以在这个任务的后台使用一个列表来看到它。然而,普通词典的大小并没有发生任何变化,所以我对普通词典也使用列表来保持插入顺序这一事实表示怀疑。
那么,更新的python版本中的规则条到底是如何保持键顺序的?
发布于 2021-08-09 13:34:05
严格地说,这是一个实现细节。Python只指定dict
确实记住键顺序,而不是它是如何执行的。
Python3.6没有保证键顺序;这是dict
类型在CPython中的实验性重新实现。当(如预期的)该实验被认为是成功的时候,Python本身就需要在Python3.7中保存密钥顺序。
在CPython中,修改dict
类型本身的C实现。我不确定具体的方法(您可以查看细节这里),但是在内存中保留一个额外的列表可能比在OrderedDict
级别执行等效的操作更有效,这正是OrderedDict
所做的。它甚至不是保存键的Python list
:它是一个纯Python链接列表,因此内存需求如此之大并不令人惊讶。
https://stackoverflow.com/questions/68712851
复制相似问题