dict和OrderedDict的异同(since 3.6)

2020年12月14日 / 6次阅读 / Last Modified 2020年12月14日
Dict

从python 3.6 开始,builtin的dict对象,也能够记录insert order,但还是跟collections.OrderedDict有不一样的细节。

看别人的文章说,python3.6开始,dict对象不仅仅是记录了插入键值对的顺序,整体性能也大幅提升。

对象比较时

两个dict对象比较,无论按什么顺序insert数据,只要数据是一样的,他们就是相等的:

>>> d1 = {}
>>> d1['a']=1
>>> d1['b']=2
>>> d1['c']=3
>>>
>>> d2 = {}
>>> d2['c']=3
>>> d2['a']=1
>>> d2['b']=2
>>>
>>> d1 == d2
True

而两个OrderedDict对象,要让它们相等,不仅数据要完全一样,插入顺序也要完全一样:

>>> from collections import OrderedDict
>>> od1 = OrderedDict()
>>> od1['a']=1
>>> od1['b']=2
>>> od1['c']=3
>>>
>>> od2 = OrderedDict()
>>> od2['c']=3
>>> od2['a']=1
>>> od2['b']=2
>>>
>>> od1 == od2
False

Reordering

OrderedDict对象有一个move_to_end函数,是dict对象所没有的,我们可以用move_to_end函数来实现一定程度的reordering(重排序)。

>>> for k,v in od1.items():
...     print(k,v)
...
a 1
b 2
c 3
>>> od1.move_to_end('b')
>>> for k,v in od1.items():
...     print(k,v)
...
a 1
c 3
b 2
>>> od1.move_to_end('c', last=False)
>>> for k,v in od1.items():
...     print(k,v)
...
c 3
a 1
b 2

last参数默认是True,当为False时,就是反过来的顺序。

dict对象如果要实现move to end,可以先pop,然后重新insert到最后。

性能

其实,有OrderedDict,就是因为python在3.6之前的dict都是无序的。但是从3.6开始,dict也有序了,而且有了性能上的提升。我想OrderedDict会逐渐边缘化了,新项目应该很难再有理由使用它了。

我的理解,OrderedDict是一个纯Python的实现,性能上是不如dict的。

-- EOF --

本文链接:https://www.pynote.net/archives/3037

留言区

《dict和OrderedDict的异同(since 3.6)》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    虽然从python3.6开始,dict有顺序了,但是当我们要访问dict对线中的第N个元素的时候,还是只能通过遍历的方式(O(N))。dict不支持随机存取(O(1))。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top