Python sp字典

2024-10-03 06:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用字典来存储映射到唯一值的唯一键。在

第一个键是str和value int,我使用了系统获取大小(dict)为了得到尺寸,我还将dict打印到一个文件中。在

debugggg = csv.writer(open("debug1.txt", 'w')) 
for key, val in diction.items():
      debugggg.writerow([key, val])

我从文件中得到了296MB,从中得到了805306648系统获取大小()

然后作为值,我存储了相同的键,但这次我在映射之前对它们进行了哈希处理

^{pr2}$

我希望这会比之前的方法更压缩。在

我运行相同的函数来得到尺寸。从文件中我得到了362MB(!)从系统获取大小()我得到了和以前一样的结果(805306648)

处理的时间是相同的,因为它是预期的O(1)查找。但我对尺码有点困惑。在


Tags: 文件csvkey字典value尺寸系统val
2条回答

sys.getsizeof(some_dict)说明了内部哈希表的大小,它与键的数量大致成正比。但是它没有考虑到键和值的大小,部分原因是这很难正确执行,部分原因是可能有许多其他对象引用,因此包含它们有点误导(例如,它们的大小可能会分摊到许多不同的dict上)。在

至于文件大小:除了这个包含键和值的大小之外,值(整数)的编码方式不同,可能效率更低。总体而言,这可以通过一个int对象包含大量元数据并将实际数据取整为4到8个字节这一事实来平衡。其他因素:CSV文件包括逗号和换行符,哈希值通常是一个大数字,比许多短字符串大(hash("a")在我的机器上是-392375501)。在

旁注:使用diction[hash(mykey1_)] = ...构建的dict很可能是错误的。你在字典之外做散列,所以它不能保护你免受哈希冲突的影响。您可能会丢失一些值,因为它们的键散列为同一个整数。由于内部哈希表始终是2的幂次方,并且仅在某个阈值下调整大小,因此较少的几个条目不一定会显示在sys.getsizeof中。在

首先,O(1)是dict中查找的平均时间,但它可能与O(n)一样糟糕。Here's the source for that information。在

其次,hash函数返回一个整数。sys.getsizeof(hash("Some value"))在我的平台上返回12。但是,如果你仔细研究一下python dictionaries are implemented键的大小与整个字典占用多少字节没有多大关系。这更多地与你存储了多少个项目有关,而不是你如何访问它们。在

相关问题 更多 >