【问题标题】:Are dicts always the most efficient way to store hashes in python?字典总是在 python 中存储哈希的最有效方法吗?
【发布时间】:2013-06-16 10:27:41
【问题描述】:

在许多语言中,散列映射/关联数组有许多不同的实现,每种都适用于不同的任务。据我所知,在 Python 中只有 dict。

所以我想我想知道的是,是否有任何应用程序对自定义数据结构有意义?或者它是否总是比使用 Python 的一种内置数据结构慢?

【问题讨论】:

  • 看看 dictobject.c - 令人惊奇的是,其中包含了多少思想、数学和基准测试。还要考虑到,如果您在 Python 中实现它,您将开始时会持续减速至少 10 倍,可能高达 100 倍。
  • 你可能想看看这个PyCon video关于强大的字典
  • “在许多语言中,散列映射/关联数组有许多不同的实现,每种都适用于不同的任务。”我一定很累,但是您能否提供一些主流脚本语言中可用的“不同实现”的示例?
  • @JordanReiter 请注意,这个接口是由一些根本不是独立实现的类实现的,而只是HashTable 周围的专用子类/包装器(可以并且确实在 Python 中创建)太):属性、AuthProvider、PrinterStateReasons、Properties、Provider、RenderingHints、SimpleBindings、TabularDataSupport、UIDefaults。其他实现在 Python 中具有等价物:WeakHashMapweakred.WeakKeyDictionaryLinkedHashMapcollections.OrderedDict。仍然有一些真正不同的实现,Scala 有更多示例。
  • @JordanReiter 此外,其中两个实现不是哈希表,而是二叉搜索树,它需要一个更通用的接口(SortedMap)。包括这些是有争议的(尽管并非完全错误)-它不同的东西,但它不能被哈希表替换的用例很少见且范围很窄,而且 Python 没有二进制完全搜索树(在标准库中)。

标签: python data-structures hashmap


【解决方案1】:

这可能应该在评论中,但太长了...

Python 字典被实现为hash table平均 (O(1)) 哈希表很适合检索项目。如果它们总体上很好,那么当有很多碰撞时,它们的性能就会下降。冲突是指计算的两个不同键的哈希值相同。所以在最坏的情况下,如果所有的键都具有相同的散列,它们的搜索操作复杂度是 O(n)——这相当于线性搜索。

但是associative arrays 可以通过使用其他几种数据结构来实现。值得注意的是binary search trees(不太好:平均为 O(log n),最坏为 O(n))或B-tree(更好:平均为 O(log n))。 AFAIK 标准 Python 库不提供任何这些。通过谷歌搜索一点,它似乎有各种实现。

这引出了您问题的核心:“是否有任何应用程序对自定义数据结构有意义?或者它是否总是比使用 Python 的内置数据结构之一慢?”。就我自己而言,我认为任何这些数据结构的任何纯 Python 实现都可能慢慢地成为原生 Python 字典。如果您有非常特殊的需求,您可以考虑在 C 级别实施这些需求。但如果你有这样的限制,也许 Python 一开始并不是最好的选择。

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2014-01-29
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多