簡體   English   中英

實現Python整數鍵和值numpy字典

[英]Implementing Python integer key and value 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數組作為主干以節省空間? 我還希望字典可以針對整數進行優化。 為什么numpy還沒有提供這樣的東西,我將如何去做呢?

我理想地要做的是實現一個字典,但使用固定大小的numpy數組作為主干以節省空間

固定大小的數組顯然可以為您提供固定大小的字典。 (您顯然不能進行鏈接,因為您不能將鏈接列表粘貼在numpy的int數組中……)這可以接受嗎?

我還希望字典可以針對整數進行優化。

這到底是什么意思? 您仍然需要對整數進行哈希處理,以獲取鍵的合理分布。 也許您可以為固定大小的整數想出一個更快的哈希函數,但是我懷疑它會為您帶來很多性能上的好處。

為什么不numpy已經提供了這樣的東西

因為它與numpy的含義不是很緊密相關,所以可以使用數字編程。 事實上,即使事情一定的相關性numpy的,但不是“根本”不夠往往會得到分流到像SciPy的,而不是numpy的本身庫。

我將如何去做呢?

您不知道如何實現哈希表嗎? StackOverflow的答案不是學習基本數據結構基礎的地方,但是Wikipedia的文章看起來不錯。

如果您希望它盡可能地像Python的dict的哈希表一樣工作,那么最好的辦法就是查看源代碼。 實際上, CPython在解釋注釋中的工作方式方面做得非常好。 但是當然是C代碼,而不是Python,因此,除非您了解一些基本的C並了解它的作用,否則對您來說就沒有意義了。 您可能想看一下PyPy,盡管它的來源要復雜一些(它具有CPython沒有的許多優化),但它是在Python中。

在PyPI上還有許多自定義哈希表實現

您還可以簽出fixedhash 我將它寫成盡可能簡單的哈希表,以此作為基礎來顯示不同探測功能的影響(首先是簡單的線性探測),但是我想它也應該作為顯示如何進行探測的基礎。建立盡可能簡單的哈希表。 :)它圍繞一個字節bytearray構建,用於存儲8個字節的bytes鍵和值; 更改它以使用np.ndarray存儲4字節整數鍵和值應該是顯而易見的,並且可以使用Nx3或Nx4數組這一事實應使其更具可讀性(沒有struct.pack東西)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM