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