栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python内存优化技巧

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python内存优化技巧

我建议如下:将所有值存储在数据库中,并保留一个以字符串哈希为键的内存字典。如果发生冲突,请从数据库中获取值,否则(大多数情况下)使用字典。实际上,它将是一个巨大的缓存。

Python中的字典存在一个问题,即它们占用了大量空间:即使int-int字典在32位系统上每个键值对也使用 45-80字节
。同时,每对int

array.array('i')
仅使用 8个字节 ,并且通过少量记账就可以实现基于数组的 int→int
字典的合理快速运行。

一旦有了内存效率高的int-int字典实现,就将您的 字符串→(对象,int,int) 字典分成三个字典,并使用哈希代替完整的字符串。您将获得一个
int→对象 和两个 int→int 字典。模仿 int→对象 字典,如下所示:保留对象列表并将对象的索引存储为 int→int 字典的值。

我的确意识到要获得基于数组的字典需要涉及大量的编码。我遇到了与您类似的问题,并且实现了一个相当快,内存效率很高的通用hash-int字典。
这是我的代码(BSD许可证)。它是基于数组的(每对8个字节),它负责密钥散列和冲突检查,它在写入过程中使数组(实际上是几个较小的数组)保持有序,并在读取时进行二进制搜索。您的代码简化为:

dictionary = HashIntDict(checking = HashIntDict.CHK_SHOUTING)# ...database.store(k, v)try:    dictionary[k] = vexcept CollisionError:    pass# ...try:    v = dictionary[k]except CollisionError:    v = database.fetch(k)

checking
参数指定发生冲突时发生的情况:在读取和写入时
CHK_SHOUTING
提高,
CollisionError
在读取时
CHK_DELETING
返回
None
,并且在写入时保持沉默,
CHK_IGNORING
不进行冲突检查。

接下来是对我的实现的简要说明,欢迎使用优化提示!顶层数据结构是数组的常规字典。每个数组最多包含

2^16 =65536
整数对(的平方根
2^32
)。键
k
和对应的值
v
都存储在
k/65536
-th数组中。数组按需初始化,并按键保持顺序。每次读取和写入都会执行二进制搜索。冲突检查是一个选项。如果启用,尝试覆盖现有键的操作将从字典中删除键和关联的值,将该键添加到一组冲突键中,并且(再次可选)引发异常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/626543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号