【问题标题】:List or dictionary?列表还是字典?
【发布时间】:2015-06-21 21:10:39
【问题描述】:

我有一些值要存储在某个容器中,以便以后仅按位置检索,例如:

index:0
value:(30,6700,3,21543)
index:34
value:(2,1)
index:36
value:(1,2,3,4,5,6,1001,9999)
index:69
value:(11)

其他地方都是空的。其中大约只有 1/4 有值。

稍后我需要通过myList[34]=(2,1,9999,999999,9999999) 之类的操作来访问和修改(附加)这些值。

那么我需要这样做:是9999 in myList[34]?是120 in myList[34]

我不知道是否应该创建一个字典来将它们存储为键值对,或者使用一个列表。列表似乎是最直观的方式,但列表中的大部分位置都会是空的。

列表或字典哪个更快?或者还有其他时间性能更好的数据容器吗?

时间是我最关心的问题。我昨天写了一小段代码,它已经运行了 20 多个小时。我很沮丧:-(

【问题讨论】:

  • 如果您的索引将是整数(而不是浮点数),那么 dict 是最好的选择,特别是如果您想稍后添加/删除内容。列出 100 项的清单只是为了在几个地方有实际价值是不可行的。
  • 看起来你想要的是集合的字典而不是元组的列表。集合成员资格测试是 O(1) 平均情况。字典查找也是 O(1) 平均情况。
  • 这里有一本字典更好。它们对您来说似乎不那么直观,因为您使用它们的频率不如列表。事实上,存储键:值对正是您想要做的,因此字典应该是直观的解决方案。
  • “时间是我最关心的问题”。如果这是真的,那么浪费的列表空间可能无关紧要。
  • 您的代码很慢可能不是因为您选择的数据结构,而是因为您正在执行诸如循环数十万个条目之类的操作,而 Python 中的循环速度很慢。使用 dict 因为它比此处的列表更自然,但请考虑分析您的代码以查看真正的问题。

标签: python containers


【解决方案1】:

速度:列表*

最佳编码实践:字典

* 如果你有足够的内存来存储列表并且数据集不会增长/收缩很多,那么使用列表将是最快的。

如果数据集增长/缩小很多,或者您无法将其全部放入内存中,那么您必须使用字典。


请注意,我对列表的上述建议只是为了提高速度 - 这不是好的编码习惯。

【讨论】:

  • 如果我有足够的空间来存储列表。我实际上知道数据增长了多少。每个条目增长 15 倍,长度不超过 15。它们从不缩小。问题是,这份名单的庞大规模是否会对时间产生影响?我的代码是供实际使用的,而不仅仅是实践。
  • @MarvellousMartha Best coding practices 与实践无关 :)。当我说列表不应增长/收缩太多时,我指的是列表中元素的数量,而不是单个元素的大小。
  • 哦。这东西仅供我使用。如果有什么东西可以将我在电脑前等待的时间从 10 天减少到 9 天,我很乐意放弃任何编码实践。我可以让列表在启动时准备好足够的空槽,但是单个元素的大小呢?我也可以这样做吗?频繁更改大小会导致列表变慢吗?
  • @MarvellousMartha 您不能对单个元素执行此操作。另外,如果速度很重要,请查看 PyPy。
【解决方案2】:

在列表和字典中按索引访问元素是 O(1) - 请参阅 Python wiki entry on time complexity 了解更多详细信息。

鉴于此,这里最重要的问题是空间,既然你说你的收藏是稀疏的,那么字典将是首选。

【讨论】:

  • 两者都是 O(1) 的事实并不能告诉您太多 - 列表索引可能快 5 倍。
  • 根据我刚刚做的一些timeit 测试,带有整数键的字典实际上与列表的速度相同。整数是自己的哈希,所以没有哈希计算。
  • 我会收回...这似乎在某种程度上取决于您正在访问的密钥。尽管如此,即使在最坏的情况下,dict 的速度仍然是列表中最好情况的三分之二。我将timeit("a[50000]", "a={x:x for x in range(100000)}")timeit("a[50000]", "a=list(range(100000))") 进行了比较,我认为在大多数实际应用程序中,你正在做的任何其他事情都会淹没它。
  • 在我看来,这听起来有点倒退。如果这是真的,这是否意味着列表的庞大实际上确实会使其变慢?
【解决方案3】:

对于您所描述的情况,您肯定需要dict 而不是list;这样你就只为现有的项目使用空间。

对于 contents 你希望有set(..) 而不是元组;这将使您的in 检查恒定时间而不是依赖于长度。

【讨论】:

    【解决方案4】:

    您应该制作一本字典,因为您知道要放置项目的索引(键)。制作一个只有四分之一的位置有值的列表/数组不是这里的方法。这会让事情变得不必要的困难。加上列表/数组将远远大于您实际需要的空间。

    【讨论】:

      【解决方案5】:

      我建议使用字典。

      字典和列表都有 O(1) 的平均案例查找时间。

      它会节省空间来使用字典,而不是在未使用的列表索引上浪费空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-08
        • 2012-05-18
        • 1970-01-01
        • 2013-03-27
        • 2015-09-21
        • 1970-01-01
        • 2012-04-09
        • 2018-02-06
        相关资源
        最近更新 更多