【发布时间】:2014-07-21 04:34:18
【问题描述】:
我想做一个查找映射 32 位整数 => 32 位整数。
输入键不需要连续,也不需要覆盖 2^32 -1(我也不希望这个内存占用那么多空间!)。
该用例用于扑克评估器,因此必须尽可能快地进行查找。完美的散列会很好,但这可能有点超出范围。
我觉得答案是某种 cython 解决方案,但我不确定 cython 的基础以及它是否真的对 Python 的 dict() 类型有任何好处。当然,只有一个简单的偏移量跳转的平面数组会非常快,但是我在内存中为表分配了2^32 - 1 位置,这是我不想要的。
任何提示/策略?目标是在内存占用最少的情况下实现绝对速度。
【问题讨论】:
-
“最小内存的绝对速度”:您知道这里没有最佳选择,是吗?它需要令人满意的工程权衡,即(根据定义)产生一两个次优选择。如果Ignacio's answer 太占用内存,那么模块
sqlite3可能是您最好的简单替代方案。 -
您知道您的映射将有多少条目,您是否愿意牺牲初始创建时间来加快查找速度?
-
另外,“绝对速度”对您意味着什么?在表的整个生命周期(包括创建时间)内消耗的总 CPU 周期,还是仅用于查找的周期?
-
@NickBastin:初始创建时间不是问题,只是完成查找的时间。该表最多可以有 1.33 亿个条目。
-
如果你的瓶颈是
int→int映射,你应该使用 PyPy 并使用标准 PyPydict。 PyPy is so absurdly fast for this use-case it isn't even funny.
标签: python c performance optimization cython