【问题标题】:What's the difference between a hashmap and a hashtable in Python?Python中的hashmap和hashtable有什么区别?
【发布时间】:2021-01-02 17:03:34
【问题描述】:

Python 中的 hashmap 和 hashtable 有什么区别?

我知道它们是作为字典容器实现的,但据我所知,哈希图是同步的,因此它们一次只能由一个任务/函数操作,而哈希表可以同时由多个线程操作。我很确定字典是一个哈希图,因为它允许一个“无”键和“无”值,那么 Python 中的哈希表是什么?

【问题讨论】:

  • 哈希映射和哈希表是同一事物的不同名称。可能有一些标准库(我猜是 Java 的?),其中两个名称用于同步不同的集合,但这并不真正适用于 Python,因为它有一个 GIL。没有线程不安全的字典。
  • @Ry-: GIL 不是魔法;它将保护数据结构本身不被破坏,但它不会固有地同步您可能认为的原子操作(例如,dict.setdefault 对于在 CPython 中用 C 实现的内置类型将是线程安全和原子的,但是对于用户定义的类型,GIL 可能在哈希计算或相等计算期间被释放,导致程序逻辑出现问题,即使数据结构没有直接损坏。
  • @ShadowRanger:这不正是同步哈希图提供的保证类型吗?可能我对 Java 还不够熟悉。
  • @Ry-:Java 在同步类型上的各个方法实际上是原子的(在调用方法时获取附加到对象本身/部分的细粒度锁,并一直保持到它完成调用)。所以HashtableputIfAbsent(相当于setdefault)作为语言保证是原子的,而Python的setdefault不做任何保证(CPython,作为一个实现细节,如果所有键都实现__hash____eq__ 在 C 中,没有明确的 GIL 版本,但这是 GIL 实现方式的附带副作用,而不是语言保证。
  • 你能澄清一下你认为的 hashmap 和 hashtable 是什么吗?似乎这些术语对您有一些与 Python 无关的含义。 Python 只知道dict,它恰好要求它的项目是可散列的,但实际上并不能保证它的内部结构。同样,并发通常不是 Python 规范的一部分。最后,None key/value 应该如何区分 hasmap 和 hashtable? None 在 Python 中没有特殊含义,不像其他语言中的 NULL。

标签: python hashmap hashtable


【解决方案1】:

您正在根据 Java 的集合类型进行人为的区分。在正常的编程术语中,hash map 和 hash table 是一回事。

Python 的dict 类型更类似于HashMap(因为它本身不提供任何同步保证)。如果您想要同步,您需要自己处理(threading.Lockwith 语句使这非常容易)。

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 2020-10-11
    • 2016-07-18
    • 2010-11-15
    • 2012-02-11
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多