【问题标题】:Hash Table in PythonPython中的哈希表
【发布时间】:2013-03-23 10:25:18
【问题描述】:

目前在我的程序中使用 5 个字典,其中 2 个有 1300 万个键值对。每个字典都是对,其中键是长度为 1-6 的字符值,值是键、值对的另一个字典,现在键的长度为 1-12,值是元组。

python 中的此解决方案运行良好,但效率不高,每次执行查找计数约 80 万。当在服务器上的另一个用c编写的脚本(实时过滤应用程序)上使用GHashTable时,他的表现非常出色。

我的问题是是否有任何使用 GHashTable 的对象或实现,如哈希函数是 python 满足我的要求。 python中的字典使用哈希,但为什么它在大量记录中那么慢。与 c 的 GHashTable 相比,python 字典使用的哈希效率不高。 python中有没有更好的Hash实现。

python dict 在几百万条记录中运行良好,但在重负载情况下它无法响应 O(1)。

您的 Python 进程是否适合 RAM? 是的,我有 18GB 的​​ Ram,只有 8GB 是为 postgres 和其他东西保留的。而 10GB 可用于处理。

【问题讨论】:

  • 说实话,考虑到数据的大小和性能要求,纯 Python 可能根本不是这项任务的最佳选择。 (+1)
  • 您似乎认为问题出在哈希表上,但您有任何证据吗?确保查找本身确实是问题所在。
  • 如果没有显示您的问题的工作示例,以及一些分析,您无法判断出了什么问题。 AFAIK python 的dict 很快。它们和 GHashTable 之间没有很大的性能差异,至少对于大多数用例而言。
  • 我在 python 中使用了 cProfile,而在 c 中使用了时间戳。 python dict 在几百万条记录中工作正常,但在重负载情况下它无法响应 O(1)。
  • @NPE 是否有任何可用于 python 的包装器。像 cPickle 而不是 pickle 的工作速度更快。因为 cPickle 是 pickle 的 c 实现。

标签: python c dictionary hashtable key-value


【解决方案1】:

当存在哈希冲突时,dict 使用 __eq__ 方法解决冲突,按值检查是否相等。这似乎是您放慢速度的原因。

因此,如果对于某个键 a 和 b,如果是 hash(a) == hash(b),那么我们通过检查 my_dict[a]my_dict[b] 来解决冲突。

例如,通过蛮力,我们发现hash(2**1000) 等于hash(16777216)。让我们测试一下,

>>> my_dict ={}
>>> my_dict[2**1000] = "One"
>>> my_dict[16777216] = "Two"
>>>
>>>
>>> for k,v in my_dict.items():
...     print(hash(k), v)
... 
16777216 One
16777216 Two

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多