在python / cython中绝对最快的查找

时间:2014-07-21 04:34:19

标签: python c performance optimization cython

我想做一个查找映射32位整数=> 32位整数。

输入键不是连续的,也不是覆盖2 ^ 32 -1(我也不希望这个内存消耗那么多空间!)。

用例适用于扑克评估者,因此进行查找必须尽可能快。完美的哈希会很好,但这可能有点超出范围。

我觉得答案是某种cython解决方案,但我不确定cython的基础以及它是否真的对Python的dict()类型有任何帮助。当然,只有一个简单的偏移量的平面数组会非常快,但后来我在表的内存中分配2^32 - 1个位置,这是我不想要的。

任何提示/策略?绝对速度和最小的内存占用是目标。

3 个答案:

答案 0 :(得分:5)

你写一些比dict更快的东西是不够聪明的。不要心疼;这个星球上99.99999%的人没有。使用dict

答案 1 :(得分:3)

您正在描述哈希索引集合的完美用例。您还要描述一种完美的方案,即首先编写它,然后再优化它。

首先从Python dict开始。它速度很快,绝对可以完成你需要的工作。

然后对它进行基准测试。弄清楚它需要多快,以及你的距离。然后是3个选择。

  1. 它足够快。你已经完成了。
  2. 它几乎足够快,比如大约两倍。编写自己的哈希索引,注意哈希函数和冲突策略。
  3. 它太慢了。你已经死了没有什么简单可以给你10倍或100倍的改进。至少你没有浪费任何时间在更好的哈希索引上。

答案 2 :(得分:3)

首先,你应该实际定义什么"足够快"在你做任何事之前,对你意味着什么。你总能做出更快的事情,所以你需要设定一个目标,这样你就不会疯狂。这个目标是双头的是完全合理的 - 例如"映射查找必须在这些参数中执行(最小值/最大值/平均值),以及何时/如果我们点击这些数字我们愿意花费更多的开发时间来进一步优化,但随后我们就会停止。"

其次,你应该做的第一件事就是在Cpython源代码树中复制Objects/dictobject.c中的代码(创建像intdict.c之类的东西),然后修改它键不是python对象。在更好的哈希函数之后追逐可能不会很好地利用你的整数时间,但是消除INCREF/DECREFPyObject_RichCompareBool对你的密钥的调用将是一个巨大的胜利。由于您没有删除密钥,您也可以忽略对虚拟值的任何检查(存在以保留已删除条目的冲突遍历),尽管您可能获得大部分胜利只需对新对象进行更好的分支预测即可免费获得。