当前位置: 首页 > 面试题库 >

有什么理由不使用OrderedDict?

邬阳
2023-03-14
问题内容

我指的是模块中的OrderedDictcollections,这是一个有序的字典。

如果它具有可订购的附加功能,我意识到这通常不是必需的,但是即使如此,是否还有缺点?慢一点吗?是否缺少任何功能?我没有看到任何丢失的方法。

简而言之,为什么我 总是使用它而不是普通的词典?


问题答案:

OrderedDict是的子类dict,并且需要更多内存来跟踪键的添加顺序。这不是小事。该实现dict在幕后增加了第二个,所有键的双向链接列表(这是记住顺序的部分),以及一堆weakref代理。它并没有慢
很多 ,但至少比使用plain的内存多了一倍dict

但是,如果合适,请使用它!这就是为什么它在那里:-)

这个怎么运作

基本dict只是将键映射到值的普通dict-根本不是“有序的”。<key, value>添加一对后,key会附加到列表中。列表是记住订单的部分。

但是,如果这是Python列表,则 删除 密钥将花费O(n)两倍的时间:
O(n)在列表中找到密钥的O(n)时间,以及从列表中删除密钥的时间。

因此,它是一个双向链接列表。这使得删除键的O(1)时间为常数()。但是我们仍然需要找到属于该键的双向链接列表节点。为了节省操作O(1)时间,第二个-
隐藏的dict将键映射到双向链接列表中的节点。

因此,添加新<key, value>对需要将对添加到基本字典,创建一个新的双向链接列表节点来保存密钥,将该新节点附加到双向链接列表中,并将密钥映射到隐藏字典中的该新节点。工作量是原来的两倍多,但O(1)总体上还是(预期的情况)。

同样,删除存在的密钥也要花两倍的O(1)时间,但总的来说是预期的时间:使用隐藏的字典来查找密钥的双向链接列表节点,从列表中删除该节点,然后从两个字典中删除密钥。

等等,这非常有效。



 类似资料:
  • 版本: 返回一个,其ID为“z”,偏移量为0,默认区域规则。 返回一个,包含ID“utc”和。 例如,在处理时。在这里,我能发现的唯一区别是它的打印方式不同。 我们正在来回地进行代码审查讨论,所以我想这种冲突并不罕见。 它是一个常量(此外,它的偏移量值(0)甚至被缓存)。 由于缺少区域信息,它的开销少了一点。 在UTC时,不需要考虑夏时制时间或历史变化,就像在任何其他时区一样。 因此,对于我迄今为

  • 问题内容: 对于2015年9月,以下是在Swift中制作单例的确切方法: 然后在其他地方… 没问题。 然后,您可以在整个项目范围内简单地执行以下操作: 传统习语: Model.shared.blah()…在代码库中到处可见 “我的”成语: model.blah()…在代码库中到处可见 因此,这导致一切看上去都很漂亮: (在你的项目中,那些“单变量”将是一些事情,如,,,或任何情况下可能会在您的项目

  • 问题内容: 似乎大多数人都使用XMLHttpRequest进行异步请求,但是很明显,可以执行同步请求的事实表明这样做可能是有正当理由的。那么,那个合理的原因可能是什么? 问题答案: 我认为随着HTML 5标准的发展,它们可能会变得越来越流行。如果将Web应用程序授予Web工作人员访问权限,那么我可以预见,开发人员将使用专用的Web工作人员来进行同步请求,如Jonathan所说,以确保一个请求先于另

  • 问题内容: 它应该与HTML4和XHTML向后兼容。约翰·雷西格(JohnResig)发表了一些好处。 只要我们不使用任何新功能且尚不支持的功能,就可以开始使用此doctype建立网站吗? 问题答案: 好考虑一下: 当用作text / html时,您需要的一个doctype就是触发标准模式。除此之外,对于浏览器而言,doctype不会执行任何操作。 当用作text / html时,无论您使用XHT

  • 问题内容: Python中常见的反模式是在循环中使用串联字符串序列。这很不好,因为Python解释器必须为每次迭代创建一个新的字符串对象,并且最终要花费二次时间。(在某些情况下,最新版本的CPython显然可以优化此功能,而其他实现则不能,因此建议程序员不要依赖此功能。)是执行此操作的正确方法。 但是,我听说它说过),您 _永远都不_要将它用于字符串连接,而应该始终使用或格式字符串。我不明白为什么

  • 我正在开发一个以前使用Apache Felix作为OSGi框架的嵌入式系统。我的任务是移除Felix并用Equinox替换它,因为Equinox目前支持OSGi规范的最新版本。 设备上的软件有相当数量的专有代码,这些代码与通常随Felix一起发货的某些捆绑包直接相关(比如eventadmin和log bundle)。这些捆绑包的Equinox版本非常不同,重写代码需要大量的工作。 即使在将底层框架