【问题标题】:Can `dict` replace `list` when memory is not a concern? [closed]当内存不是问题时,`dict` 可以替换 `list` 吗? [关闭]
【发布时间】:2013-04-24 11:11:46
【问题描述】:

我可以将任何列表表示为字典,其键是有效的列表索引,其值是列表的项目。例如,[5, 6, 'a'] 将表示为 {0:5, 1:6, 2:'a'}

就渐近时间和内存复杂度而言,dict 表示与list 相同。 list 使用较少的内存是一个常数因子。

如果内存不是问题,我是否总是可以使用dict 而不是列表和其他序列(以获得使用任意键的灵活性,并通过减少不同容器的数量来稍微标准化代码用过)?

【问题讨论】:

  • 按顺序访问dict项目需要O(n log n)操作。
  • @PavelAnossov:根据wiki.python.org/moin/TimeComplexitydict 是元素访问的摊销 O(1)。如果“in order”与“in order of list's indices”的含义相同,则为 O(n): for k in range(len(dict_)): yield dict_[k]
  • 列表是有序的;字典不是。当然,您可以始终使用 collections 包中的 OrderedDict
  • @Lattyware:如果我的字典表示一个列表,则通过构造,它的键是整数01、...、len(dict_)-1。所以我知道他们的顺序而不必排序。 (当然,如果我确实使用字典来存储其他键,那就另当别论了。但我只是在谈论用字典替换列表。)
  • @max 在 99% 的情况下,可读性远比优化重要,除此之外,如果您需要将这些值传递给一个接受可迭代的函数怎么办? Python 按值进行迭代,因此您可以使用特殊的迭代方法,但没有其他方法可以。 Python 是围绕按值迭代设计的。按索引迭代会产生不太灵活的代码。

标签: python python-3.x containers built-in-types


【解决方案1】:

考虑到进入其中的数据,更喜欢最有意义的数据结构。

dicts 很棒,但是,例如,它们没有顺序:因此,如果您想按顺序迭代值,则必须根据键进行排序,这会产生复杂性并且很难阅读。

一般来说,在任何地方使用dicts 代替lists 不太可能显着提高您的应用程序的速度 - 这是过早的优化。

更重要的是对代码的读者和修改器有意义的内容,以及最适合您尝试存储的数据的内容。在存储数据序列的地方,使用list。在您存储映射的位置,使用dict

【讨论】:

  • 我不希望dict会提高速度;我只是希望他们不会减少它 - 并为未来关键类型的变化提供更多的灵活性。至于顺序,列出“维护”的唯一顺序是索引的顺序。替换列表的字典(因此有键 0、1、2、...)可以免费提供这样的顺序:只需使用 for k in range(len(dict_)): yield dict_[k] 进行迭代。
  • 而且按索引迭代是丑陋且低效的。没有必要使用dicts,以后可能会需要它们。使用list,如果您以后发现需要不同的集合,请使用不同的集合。使用有意义的东西。
  • @max 添加到 Lattyware 的 - 非常非 Pythonic
  • 如果你说it's unlikely that using dicts everywhere instead of lists will make meaningful speed increases to your application - it's premature optimization.,我认为你不够清楚如果你使用dict 来模仿列表行为,它不能被称为优化,因为它会明显变慢(在一个简单的循环):)
  • A dict 对于 sparse 列表来说是可以的,其中大多数元素不会被显式初始化。编写一个类似于列表但只存储显式设置的值的 dict 子类非常容易。
猜你喜欢
  • 2017-05-11
  • 2019-01-31
  • 2013-05-04
  • 2013-12-28
  • 2013-06-03
  • 2011-08-28
  • 2013-09-07
  • 2014-06-19
  • 2011-04-13
相关资源
最近更新 更多