繁体   English   中英

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

[英]absolute fastest lookup in python / cython

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

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

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

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

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

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

您正在描述哈希索引集合的完美用例。 您还描述了首先编写它的策略的完美场景,然后优化它。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM