实现Python整数键和值numpy字典

时间:2014-09-04 08:42:37

标签: python numpy dictionary

我需要快速查找大量数据,通常我会使用字典。但是,我需要存储大约6亿个键值对,当试图将它存储在字典中时,它不适合存储。

我意识到如果字典存储了密钥并且值为具有固定长度(即32位)的整数,则字典可以节省内存。我可以通过使用numpy数组,排序数据然后使用搜索来找到正确的值(占用大约8GB)来解决我的问题:

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]

这种方法与使用哈希一样快。

我理想的做法是实现字典,但使用固定大小的numpy数组作为节省空间的主干?我也希望字典能够针对整数进行优化。为什么dosn&nnty numpy已经提供了这样的东西,我将如何做到这一点?

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

  

我理想的做法是实现字典,但使用固定大小的numpy数组作为节省空间的主干

固定大小的数组显然会为您提供固定大小的字典。 (你显然不能做链接,因为你不能将链表放在一个整齐的数组中......)这是可以接受的吗?

  

我还希望字典能够针对整数进行优化。

究竟是什么意思?您仍然需要对整数进行哈希处理,以便获得正确的密钥分配。也许你可以为固定大小的整数提出稍微快一点的哈希函数,但我怀疑它会给你带来很多性能上的好处。

  

为什么dos numpy已经提供了类似的东西

因为它与numpy的关系并不是非常密切,数值编程。事实上,即使 与numpy有些相关但又不是“基本”的东西,往往会被分流到像scipy这样的库而不是numpy本身。

  

我该怎么做?

你不知道如何实现哈希表吗? StackOverflow答案不是学习基本数据结构基础知识的地方,但Wikipedia's article看起来很不错。

如果你希望它尽可能像Python的dict哈希表一样工作,那么最好的办法就是查看源代码。 CPython实际上很好地解释了它在评论中是如何运作的。但当然它是C代码,而不是Python,所以除非你理解一些基本的C并得到它正在做的事情,否则它对你没有意义。您可能想要查看PyPy - 虽然它的源代码有点复杂(它有许多CPython没有的优化),但它在Python中。

还有一些custom hash table implementations on PyPI

您还可以查看fixedhash。我把它写成尽可能简单的哈希表作为基础来显示不同探测函数的影响(它开始的是简单的线性探测),但我想它也应该作为一个基础来展示如何构建尽可能简单的哈希表。 :)它围绕bytearray构建,用于存储8字节bytes个键和值;将其更改为使用np.ndarray存储4字节整数键和值应该是显而易见的,并且您可以使用Nx3或Nx4数组这一事实应该使它更具可读性(不是struct.pack个东西)。