实现Python整数键和值numpy字典

实现Python整数键和值numpy字典,python,numpy,dictionary,Python,Numpy,Dictionary,我有大量的数据需要快速查找,通常我会使用字典。然而,我需要存储大约6亿个键值对,当我试图将其存储在字典中时,它无法存储在内存中 我意识到,如果字典将键和值存储为固定长度(即32位)的整数,则可以节省内存。我可以通过使用numpy数组、对数据进行排序,然后使用搜索找到正确的值(大约需要8GB)来解决我的问题: 这种方法没有使用散列的速度快 理想情况下,我希望实现一个字典,但使用固定大小的numpy数组作为主干以节省空间?我还希望这本字典能为整合器优化。为什么numpy还没有提供这样的服务,我该怎么

我有大量的数据需要快速查找,通常我会使用字典。然而,我需要存储大约6亿个键值对,当我试图将其存储在字典中时,它无法存储在内存中

我意识到,如果字典将键和值存储为固定长度(即32位)的整数,则可以节省内存。我可以通过使用numpy数组、对数据进行排序,然后使用搜索找到正确的值(大约需要8GB)来解决我的问题:

这种方法没有使用散列的速度快

理想情况下,我希望实现一个字典,但使用固定大小的numpy数组作为主干以节省空间?我还希望这本字典能为整合器优化。为什么numpy还没有提供这样的服务,我该怎么做呢

理想情况下,我希望实现一个字典,但使用固定大小的numpy数组作为主干以节省空间

一个固定大小的数组显然会给你一个固定大小的字典。(您显然不能进行链接,因为您不能将链表粘贴到整数数组中…)这可以接受吗

我还希望这本字典能为整合器优化

这到底意味着什么?您仍然需要对整数进行散列,以获得适当的密钥分布。也许您可以为固定大小的整数设计一个稍微快一点的哈希函数,但我怀疑它是否会给您带来性能上的好处

为什么numpy还没有提供这样的服务

因为它与numpy的全部内容,数值编程,并没有非常密切的关系。事实上,即使是与numpy有些关联但不够“基本”的东西,也倾向于分流到像scipy这样的库中,而不是numpy本身

我该怎么做呢

您不知道如何实现哈希表吗?StackOverflow答案不是学习基本数据结构基础知识的地方,但它看起来相当不错

如果您希望它尽可能像Python的
dict
哈希表一样工作,那么最好是查看源代码。实际上,在评论中解释它是如何工作的做得很好。但当然,这是C代码,而不是Python,所以除非您理解一些基本的C语言并了解它的功能,否则它对您来说是没有意义的。您可能想看看PyPy,尽管它的源代码有点复杂(它有许多CPython没有的优化),但它是用Python编写的

还有一些


你也可以退房。我把它写成一个简单的哈希表,作为一个基础来显示不同的探测函数的影响(一开始它是简单的线性探测),但我猜它也应该作为一个基础来说明如何尽可能简单地构建一个哈希表。它是围绕一个
bytearray
构建的,用于存储8字节
bytes
键和值;将其更改为使用
np.ndarray
来存储4字节整数键和值应该是显而易见的,而且您可以使用Nx3或Nx4数组这一事实应该会使其更可读(没有任何
struct.pack
内容)。

据我所知,numpy数组并不打算用作数据库,即快速索引。也许pandas()可以帮助您……您是否考虑过使用类似于
dbm
的磁盘结构?它显然不会像定制的int32散列那样快速或紧凑,但会简单得多(比如,只需一个
import
语句,而不是需要编写和调试的100行代码),而且它还可以免费提供持久性(我猜你会想要的)。速度至关重要,所以内存中的解决方案更可取我应该早点问这个问题,但是…你经常查找彼此靠近的一串键吗?如果是这样的话,哈希将在排序数组上产生严重的开销,因为您将丢失所有缓存和VM位置。而且,根据您的数据分布情况,有一些方法可以加快二进制搜索速度,这可能会有所帮助。@abarnert-Yes键仅在特定范围内。如何加快二进制搜索?这个答案给了我很多指导,谢谢。
import numpy as np    
key_a = np.zeros(600e6, dtype=np.int64)
values_a = np.zeros(600e6, dtype=np.int32)

# ... Fill arrays ...

# Find value using key:
index = np.searchsorted(key_a, key_to_find)    
value_to_find = values_a[index]