Microdict库 - 一个高性能的Python散列表实现
项目描述
Microdict
一个高性能的Python散列表库,通常比Python字典更快,并且消耗的内存显著更少。它目前支持Python 3.5及以上版本。
为什么是Microdict?为什么需要创建另一个散列表库,当Python内置了字典时?
Python 字典运行速度快,但内存消耗也可能很高。这主要归因于 Python 将数据以 PyObjects 的形式存储在内存中,其内存消耗远大于整数和字符数组等本地类型。因此,在构建内存密集型 Python 应用程序时,Python 字典在很多情况下可能会成为限制因素。这促使我开发了一个类型化的 Python 哈希表库,其内存消耗显著(最多减少 7 倍)低于 Python 字典。它也比 Python 字典更快。此外,其底层的 C 实现还可以超越 Google 的经过高度优化的 Swiss Table 和 Facebook 的 F14 哈希表。请参阅 性能部分。
安装和构建
您可以使用 pip 安装 Microdict: pip install microdict
。
Microdict 完全使用 C 扩展构建,因此构建它需要 Python C API 头文件。克隆存储库后,请在终端中使用 python setup.py install
命令构建和安装软件包。Microdict 已在 Linux、Mac OSX 和 Windows 系统上进行了测试。在 Linux/mac osx 系统上,您需要 GCC 7+,在 Windows 系统上需要 Visual C++ 14+ 编译器来构建软件包。为了获得最佳性能,请使用 64 位系统。
运行测试
安装完成后,请在您的 Python 解释器中输入以下代码片段以运行测试
from microdict import run_tests
run_tests.run()
用法
以下代码片段显示了库的常见用法。
from microdict import mdict
dict_i32 = mdict.create("i32:i32") # Generates a dictionary with key and value type of signed 32 bit integer.
dict_i32[1] = 2 # Just like python dictionaries, setting a key value pair.
try:
print(4 in dict_i32) # prints False after catching a KeyError exception.
except KeyError:
pass
print(dict_i32[1]) # prints 2
try:
print(dict_i32.pop(4)) # prints None.
except KeyError:
pass
print(dict_i32.pop(1)) # Removes [1,2] from the hashtable and prints 2.
dict_i32[10] = 0
dict_i32[5] = 1
dict_i32[6] = 8
for k in dict_i32:
print(k) # Will print 10, 5, 6
for v in dict_i32.values():
print(v) # Will print 0, 1, 8
for k,v in dict_i32.items():
print(k,v) # Will print all the items.
d2 = dict_i32.copy() # Creates a deep copy of dict_i32.
dict_i32.clear([10,6]) # Removes the pairs [10,0] and [6,8]
dict_i32.clear() # Makes the dictionary empty.
pydict = d2.to_Pydict() # Returns a python dictionary containing all the items in d2
pydict[120] = 5
pydict[42] = 9
d2.update(pydict) # d2 now will additionally have the pairs [120, 5] and [42, 9]
dict_i32[111] = 89
dict_i32[123] = 1
d2.update(dict_i32) # d2 now will additionally have the pairs [111, 89] and [123, 1].
print(list(d2.items())) # prints all d2 items
"""
Faster approach shown below. d2.get_items() creates and returns a list of all items.
So if you don't need a list container, iterate using d2.items() for memory efficiency.
Same applies for other d2.get_* methods shown below.
"""
print(d2.get_items()) #
print(list(d2.values())) # prints all d2 values
print(d2.get_values()) # Same but faster approach
print(list(d2)) # prints all d2 keys
print(d2.get_keys()) # Same but faster approach
哈希表类型
目前,Microdict 包含 5 种类型的字典
"i32:i32"
-> 32 位有符号键和 32 位有符号值"i32:i64"
-> 32 位有符号键和 64 位有符号值"i64:i32"
-> 64 位有符号键和 32 位有符号值"i64:i64"
-> 64 位有符号键和 64 位有符号值"str:str"
-> 字符串键和字符串值。
方法文档
-
microdict.mdict.create (dtype, key_len=None, val_len=None)
: 返回一个 Microdict 哈希表,类型可以是上述任意一种。
参数
- dtype: 一个 Python 字符串类型(
str
),用于设置要创建的哈希表类型。可以是上述任意一种 类型。 - key_len: 一个 Python 整数类型(
int
)。它设置键(UTF-8 字符串)字符的最大字节数。如果传递的 UTF-8 编码字符串键消耗的字节数大于 key_len,则不会接受。此参数仅适用于dtype="str:str"
。它只接受最多 65355 的值,更大的值将引发TypeError
。 - val_len: 一个 Python 整数类型(
int
)。它设置值(UTF-8 字符串)字符的最大字节数。如果传递的 UTF-8 编码字符串值消耗的字节数大于 val_len,则不会接受。此参数仅适用于dtype="str:str"
。它只接受最多 65355 的值,更大的值将引发TypeError
。
- dtype: 一个 Python 字符串类型(
-
microdict.mdict.listDictionaryTypes ()
: 打印一系列形式为
键类型: key_t . 值类型: val_t
的行,其中key_t:val_t
形成上述 类型。
以下是在 mdict.create
返回的所有哈希表类型中常见的通用方法。
-
clear (key_list = None)
: 返回 None。如果未提供 key_list,则 clear 方法将删除哈希表中的所有项。
参数
- key_list: 这是一个可选参数,但不是关键字可选参数(关键字参数必须不提供)。所以,可以这样使用:
keys = [1,2]; d.clear(keys)
。如果提供了,它必须是list
类型。key_list 中的条目是要从哈希表中删除的键。默认情况下,哈希表中不存在的任何条目都将被跳过。对于任何整数哈希表类型,任何非 Pythonint
条目都将被跳过。程序员需要传递正确大小的整数以防止溢出。对于str:str
类型,条目必须是 Python UTF-8 字符串,UTF-8 字符字节最多为 key_len,由mdict.create
设置,否则,该条目将被跳过。
- key_list: 这是一个可选参数,但不是关键字可选参数(关键字参数必须不提供)。所以,可以这样使用:
-
copy ()
: 返回与调用者哈希表对象相同类型的 Microdict 哈希表的深拷贝。
-
get_items ()
: 创建并返回一个包含哈希表中所有项(键,值)的 Python
list
。 -
get_keys ()
: 创建并返回一个包含哈希表中所有键的 Python
list
。 -
get_values ()
: 创建并返回一个包含哈希表中所有值的 Python
list
。 -
items ()
: 用于使用
for
循环遍历项。例如:for k,v in d.items() : print(k, v)
。 -
pop (key)
: 从哈希表中删除 key 并返回其对应值。如果 key 不存在,则引发
KeyError
。参数
- key: 对于任何整数哈希表类型,任何非 Python
int
条目将引发TypeError
。程序员需要传递正确大小的整数以防止溢出。对于str:str
类型,条目必须是 Python UTF-8 字符串,UTF-8 字符字节最多为 key_len,由mdict.create
设置,否则,将引发TypeError
。
- key: 对于任何整数哈希表类型,任何非 Python
-
to_Pydict ()
: 创建并返回一个包含 Microdict 哈希表中所有项的 Python 字典。
-
update (dictionary)
: 将字典中存在的所有项插入到 Microdict 哈希表中。
参数
- dictionary: 必须是 Python 字典或 Microdict 哈希表。如果是 Python 字典,则所有与 Microdict 哈希表类型相同的项将被插入。默认情况下,其他项将被跳过。与 clear 方法文档中关于类型约束的条件也适用于此处。
-
values ()
: 用于使用
for
循环遍历值。例如:for v in d.values() : print(v)
。
性能
与 Python 字典竞争
下表中的每个单元格的格式为(速度增益,空间增益)。
-
速度增益的定义如下:
。
-
同样,空间增益:
对类型"i32:i32"
、"i64:i64"
、"str:str"
(键和值长度均保持为8个字符)进行了实验。通过平均使用(独特)随机生成数据进行的30次实验的结果来计算速度提升和空间提升。空间消耗使用psutil库进行计算。时间消耗使用time.perf_counter
方法进行计算。所有实验均在Python 3.8.2和64位Ubuntu 20.04 LTS系统上完成。以下表格显示了使用完整键集和[]
运算符检索所有值时与Python字典的基准测试。
项目数量 | i32:i32 |
i64:i64 |
str:str |
---|---|---|---|
100000 | 1.48x, 7.13x | 1.29x, 4.67x | 1.43x, 5.19x |
1000000 | 1.47x, 4.23x | 1.48x, 2.64x | 1.46x, 4.46x |
10000000 | 1.44x, 4.77x | 1.48x, 3.02x | 1.53x, 4.97x |
3x10000000 | 1.55x, 4.19x | 1.3x, 2.57x | 1.36x, 3.93x |
与Google的Swiss Table和Facebook的F14竞争
Microdict的底层C实现与Swiss Table->
abseil::flat_hash_map和F14->
folly::F14FastMap进行了基准测试,以进一步测试其功能。数据类型使用上述相同设置进行设置。以下表格显示了使用键检索所有值的结果。
abseil::flat_hash_map | folly::F14FastMap | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
microdict-0.1.1-cp39-cp39-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | df4c0b59479d980de81c75154c3153b700c61528af53402e5161dd69362dc7b1 |
|
MD5 | de3c0b87272d85636931cfda94ec657f |
|
BLAKE2b-256 | f247200c0fadea0824330bd2dfdbed13c13a3adad4fd262d322cce0c7798333f |
microdict-0.1.1-cp39-cp39-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 649c0870c5c5007ca4b9365254c2bb62eda47584605a6bfe0df1ac151c080aa4 |
|
MD5 | 9db918fbc2cd87b8b254cb51e3d41d96 |
|
BLAKE2b-256 | eb4fbff04e931e4fe2a202ee4b3c7bd0f1a403aef22be67e3a71eafba2ef9384 |
哈希值 for microdict-0.1.1-cp39-cp39-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e883232685dcc5870f4f4b0e699f8a3c11c6f14b420a6c345744d6bea012eba1 |
|
MD5 | 946b632cdc8cfa57b73c4b6f8d084bea |
|
BLAKE2b-256 | e7ba10d13736966d23f50d2b7f74aa295ec4f0768d7d8c4d940201e46e8142b7 |
哈希值 for microdict-0.1.1-cp39-cp39-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c6447a8cff41b76d9b7e4921a0c3c85fd81f56bac2ec1c97a88d8c8e52af8ccf |
|
MD5 | f13cb1b9b51bff1816104fa396daac28 |
|
BLAKE2b-256 | c644481ac786408bef4013906f913cf62a23b9a55398ea2edc298cf84028a3a4 |
哈希值 for microdict-0.1.1-cp39-cp39-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 399f5bc6c82839646bce2d73e7a9abb7bed7ebe1bf09e03b3a27aa67a37139ad |
|
MD5 | 35c304104c7ccd5f43ddf1584a868750 |
|
BLAKE2b-256 | 6b992bff7328c2c91649463a2077bbd5c36ab94646212742788256f9ff47ee46 |
哈希值 for microdict-0.1.1-cp39-cp39-manylinux1_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d178b23c3d90904a7bf93d3efa8ed385d08f7639e099653baa8c2a3b97d3a649 |
|
MD5 | 4d68d0caf33c62bb0c5e56c7efb79a3c |
|
BLAKE2b-256 | 31775b0c6bf8ae83865e51e808c664140a494ed85c5eb9873fe1f56bb81534de |
哈希值 for microdict-0.1.1-cp39-cp39-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ff9632ec070b95a497667a9437ef42285a685cdc646406d74eb322c1ca03bbbf |
|
MD5 | 03e0c68a6ab864b5cb2a556e52c3013b |
|
BLAKE2b-256 | 151c987cd64c26bf7814521a4d3295b2163f46f19402e5b29f7c97f56aa46617 |
哈希值 for microdict-0.1.1-cp38-cp38-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2c40ace4cf6c58c818f98363171f169fa1673f5a93d79306a622856756d76342 |
|
MD5 | b30f06010a55e406b9d6856382842cf7 |
|
BLAKE2b-256 | 01c543b256887feb0f6606a24a2c6d5ddac41ff1d3077d83b68b390c88eb7b69 |
哈希值 for microdict-0.1.1-cp38-cp38-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 595f354b9b7dab735625496210076a5ca5a3aa9dcc765a95c4297b899bafbfa1 |
|
MD5 | b082a3f2c861387d824b78acb39c4c42 |
|
BLAKE2b-256 | d27a1c76ecfc60870849be29e22bbe04807bda84dd0073c4ba3b199c9c2454f0 |
哈希值 for microdict-0.1.1-cp38-cp38-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f80cc1bb954687996dfcaa888812b22078672d144a087581199d8f5b331be542 |
|
MD5 | 042499346342d4ab30abff716a735895 |
|
BLAKE2b-256 | 2823880d004d6b54645fa9e32b76a2fed43557231fa57aec4c90842b99439c63 |
哈希值 for microdict-0.1.1-cp38-cp38-manylinux1_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dc0d5278e14a60fdf6cdcfeccf5626159c7031167b641ebb50fe6ecf44d1174e |
|
MD5 | 3adb0ce11632a75bccf9bd3c7f4ca6cf |
|
BLAKE2b-256 | eb1485dd8887a50973c0b2e9967624a80ef8d35acb4ee8160ab54f0ae357f4e1 |
哈希值 for microdict-0.1.1-cp38-cp38-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 09e7d57dd067d2f49cc64f3bc0029b2f1350337d568b335dd253acd8d704b365 |
|
MD5 | 56816360a866b76f3ef473a7fe6f8a43 |
|
BLAKE2b-256 | 18b648ac2db74ff9ad93996e800a0613c558a6c7e0cb4b79ed6aef52c1a8437c |
哈希值 用于 microdict-0.1.1-cp37-cp37m-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bcba03c07150a8669b2d323a65fb5864ce3835c328127609744d526b7b06adff |
|
MD5 | 6a6175fdee2beed54505ff9f6ecd1351 |
|
BLAKE2b-256 | bd2b35c53b6073e091b7e30fc75d136bad12d41e788679f4ecaf02280b4a7367 |
哈希值 用于 microdict-0.1.1-cp37-cp37m-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1642cb6edcabf0f19f43f71727eaed444927b2f933ef13feb700964c0dfc0194 |
|
MD5 | 3cf98994e3d4e54db1c87e9805e02af1 |
|
BLAKE2b-256 | ac3d118ed31d7cb3fabce702cff2f5b444e2ac1c4fa225f5818cefb45a2f09de |
哈希值 用于 microdict-0.1.1-cp37-cp37m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bce262be1a893a89fc1eba4a509662c9cf965cff45bde334dfc32a0cc0df7caa |
|
MD5 | 61ff164d94c15a7696221dde426eb4e2 |
|
BLAKE2b-256 | 860f6c64237f42a99de6a52bfde1961d0d2ec4a7dd00e997a5a0aa7949ab50bb |
哈希值 用于 microdict-0.1.1-cp37-cp37m-manylinux1_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4c3fe474bd512d4063c042e8d09a8bf02b50388864572bf96ac2f1a696967b87 |
|
MD5 | ffcee097e59f73c5343b05af0f837d91 |
|
BLAKE2b-256 | 7412a595a3ab2984bfb46270f906da3366585cc0d20feb64d29160abb5ff9edf |
哈希值 用于 microdict-0.1.1-cp37-cp37m-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ed5c2e7fa0856c2a69b51f0c85c7f5609e3baccbeb516378bd27633e655323d8 |
|
MD5 | abea210a42513e07b77a3b14e80a51a2 |
|
BLAKE2b-256 | 2aadfb182268e9b9e753c2cc0958886ef0cff2c3e64a193c9d05d55d5192d33b |
哈希值 用于 microdict-0.1.1-cp36-cp36m-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e4cd7415f7b863a3c645c287477c32361deb2ffd3750055e04969bf574e0f0f4 |
|
MD5 | 73b082647a0b81e6908d513ddcba411a |
|
BLAKE2b-256 | b3b27faddbbbf629226aef1084f9f0c1cd269178aa0679276cc878571774115e |
哈希值 用于 microdict-0.1.1-cp36-cp36m-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2cf70204dd25119d6cf3fe1988e877e29120810c0916e6b26f78ed39faf8687e |
|
MD5 | 1b6322eff378034e1ccbe97ea0873e00 |
|
BLAKE2b-256 | ef7266ad3a8a87188421afe87a0687c0cb378d2723124ebb602aba0145b94419 |
哈希值 用于 microdict-0.1.1-cp36-cp36m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7fb0fad7758bad8403ce412d1506285f6c3106fb5021d3fe1fdce818b4570042 |
|
MD5 | f9d3606e2a21da1fdfe23a779503ec0a |
|
BLAKE2b-256 | fe554bceb4c7c625ed2abe9d35a9036fd1dcfa128d616dbd3b07400832862ad9 |
哈希值 用于 microdict-0.1.1-cp36-cp36m-manylinux1_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f361df3511ff910233d97b455c9a9c215024c49b90930905550b059eed15ac1a |
|
MD5 | 96829a59620869b1fa9b88133b55c35b |
|
BLAKE2b-256 | 9f1862c8f54f3efc423a55c2e4c9268b4fabaefc1581be16445106d049570330 |
哈希值 用于 microdict-0.1.1-cp36-cp36m-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b4a93c629964abfa9483618f9341bd2ee58b865cc0721e99525c5dc015e6bab1 |
|
MD5 | 8a40fcd4f1bf30d55e5a6074a3b65abe |
|
BLAKE2b-256 | b97d7f7e732047de0e44814ee0be4988830eaa95429b6abe3fa03687a4f33aea |
哈希值用于 microdict-0.1.1-cp35-cp35m-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e833f641d6c23b9c64ad8584b59cca282e8698f80fa191c83658918c23f55b45 |
|
MD5 | a392b4e9b39e4460aa76fc0207c95f92 |
|
BLAKE2b-256 | e3da52016402166f07718116a35ce609adb7f22977076fde3ec320a6bd930706 |
哈希值用于 microdict-0.1.1-cp35-cp35m-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e89eb15150422e12f6bed41070a81101f72cdbb1e82eb8bbb253914bbec68a38 |
|
MD5 | b1a427739dc6241ad3841ab5d20a11de |
|
BLAKE2b-256 | 3f7b60a01391fe9d2318c823a7da67e910e1d8430527edbc640ff5d66e284ff3 |
哈希值用于 microdict-0.1.1-cp35-cp35m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1e13165d690b55d2a96e2215e12be3bc7e4aa62417dbc540b5e13919c6663d58 |
|
MD5 | 2c4e64ad8545e0d58f97945ecaf812bb |
|
BLAKE2b-256 | 58f49b111a445c454f3243b96799602e04613b0a64575e0f9d5c5bff71548365 |
哈希值用于 microdict-0.1.1-cp35-cp35m-manylinux1_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fced8887153fe5ce95259d046d9ebaf594651f40ae1c044017cac86151e1e091 |
|
MD5 | 35d441cd8ad69067195decedf11b6dbc |
|
BLAKE2b-256 | a8ce3c565b461149e899e84d31107ffa6174a8bf25d1fe66fd388bf5935d1408 |
哈希值用于 microdict-0.1.1-cp35-cp35m-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0531620d444972e04adc998daa922127735c895ae830ff8bda1a489de471add4 |
|
MD5 | 7e887cde990404272261e57b6e344048 |
|
BLAKE2b-256 | 880b8ead8109521e317cf759f25cfa1125c7ba031f654beba1f7b5c87e5f4e03 |