[英]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个选择。
首先,在进行任何其他操作之前,您应该实际定义“足够快”对您意味着什么。 你总是可以做得更快,所以你需要设定一个目标,这样你就不会疯狂。 这个目标是双头的是完全合理的 - 例如“映射查找必须在这些参数中执行(最小/最大/平均)”,以及何时/如果我们达到这些数字,我们愿意花费更多的开发时间进一步优化,但我们会停止。“
其次,你应该做的第一件事就是复制Cpython源代码树中的Objects/dictobject.c
中的代码(像intdict.c
那样做一些新的东西)然后修改它以便密钥不是python对象。 追求更好的哈希函数可能不会很好地利用你的整数时间,但是消除INCREF/DECREF
和PyObject_RichCompareBool
调用你的密钥将是一个巨大的胜利。 由于你没有删除键,你也可以忽略对虚拟值的任何检查(存在以保留已删除条目的冲突遍历),尽管你可以通过更好的分支预测获得免费的大部分胜利。你的新对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.