Python 中“dict”的内存分配是如何工作的?

2023-12-04

我在玩字典时发现了这个。

import sys

Square1 = {}
Square2 = {}
Square3 = {}

for i in range(1, 8):
    Square1[i] = i**2

for i in range(1, 11):
    Square2[i] = i**2

for i in range(1, 12):
    Square3[i] = i**2


print(sys.getsizeof(Square1), len(Square1))
print(sys.getsizeof(Square2), len(Square2))
print(sys.getsizeof(Square3), len(Square3))

Output:

196 7
196 10
344 11

字典长度 7 和 10 的大小相同,均为 196,但长度 11 的大小为 344。 为什么它们是一样的?为什么尺寸会增加,长度为11? Python 中字典大小如何工作?


当您创建一个空字典时,它会为它可以存储的最初几个引用预先分配块内存。随着字典添加更多的键值对,它需要更多的内存。

但它并不会随着每次添加而增长;每次需要更多空间时,它都会添加一些内存块来容纳“X”个键值对,一旦填满“X”个量,另一块内存就会分配给字典。

这是一个随着键数增加,显示字典大小变化的示例代码:

import sys

my_dict = {}
print("Size with {} keys:\t {}".format(0, sys.getsizeof(my_dict)))

for i in range(21):
    my_dict[i] = ''
    print("Size with {} keys:\t {}".format(i+1, sys.getsizeof(my_dict)))

这是 Python 3.6.2 中的输出:

#same size for key count 0 - 5 : 240 Bytes
Size with 0 keys:    240
Size with 1 keys:    240
Size with 2 keys:    240
Size with 3 keys:    240
Size with 4 keys:    240
Size with 5 keys:    240

#same size for key count 6 - 10 : 360 Bytes
Size with 6 keys:    368
Size with 7 keys:    368
Size with 8 keys:    368
Size with 9 keys:    368
Size with 10 keys:   368

#same size for key count 11 - 20 : 648 Bytes
Size with 11 keys:   648
Size with 12 keys:   648
Size with 13 keys:   648
Size with 14 keys:   648
Size with 15 keys:   648
Size with 16 keys:   648
Size with 17 keys:   648
Size with 18 keys:   648
Size with 19 keys:   648
Size with 20 keys:   648

此外,字典仅存储保存键和值的内存引用,并且不将键值本身存储为dict目的。所以数据的类型和大小都不影响结果sys.getsizeof()对于字典。

例如,以下两个字典的大小都是 280 字节

>>> sys.getsizeof({'a': 'a'})
280

>>> sys.getsizeof({'a'*100000: 'a'*1000000})
280

然而,这是大小之间的差异'a' V/s 'a' * 1000000:

>>> sys.getsizeof('a')
38

>>> sys.getsizeof('a'*1000000)
1000037
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中“dict”的内存分配是如何工作的? 的相关文章

随机推荐

  • 如何使用 iText 在 Web 环境中通过智能卡签署 PDF?

    阅读以下参考文献 iText 数字签名白皮书 and C 示例 具体来说第4章 对于那些有兴趣的人 另一个精彩而简洁的总结PDF 签名过程 CAPICOM 文档 此处和 iText 邮件列表档案上的在线示例 问题 例如here and he
  • Jekyll 插件中的“优先级”标志应该如何工作?

    我目前正在尝试为 Jekyll 开发一个插件 这将有助于使用云数对于响应式图像 当前源是在我的 Github 仓库中 稍后当 如果它有效时 我会将其变成宝石 这个插件有两个特点 用于定义 Cloudinary 图像的 Liquid 标签 例
  • 如何对没有逻辑的类进行单元测试?

    我发现为算法编写单元测试很容易 例如 sort List 很容易编写如下测试 list 2 1 4 assert sort list 1 2 4 但我发现测试没有逻辑的方法真的很难 没有if语句 只是一组调用 我主要想知道如何对它们进行单元
  • Codeigniter - 无法调用系统的 lang() 函数

    尝试调用属于 codeigniter 系统 帮助程序 language helper php 一部分的 lang 函数 导致致命错误 Fatal error Call to undefined function lang def actio
  • facebook feed 方法链接默认添加 fb_ref=Default 在最后如何删除

    我正在使用 feed 方法从我的网站使用 asp net 和 jquery javascript 发布到我的 facebook 墙 最初它工作正常 但突然在最后的链接中添加了 fb ref Default 我不知道为什么会发生我想删除请帮助
  • 使用 ARC 避免出现悬空指针

    我有一个物体 里面有一个strong对对象的引用 property nonatomic strong NSObject thing 在其他地方 我有一个传递对象引用的方法 thirdObject doSomething secondObje
  • 对 MySQL 表中的行重新排序

    我有一张桌子 ID Name Order 1 John 1 2 Mike 3 3 Daniel 4 4 Lisa 2 5 Joe 5
  • 无法使用 http/https 将 Git 推送到远程存储库

    我在服务器上的 apache 提供的目录中有一个 Git 存储库 我已经配置了 WebDAV 并且它似乎运行正常 Litmus 返回 100 成功 我可以从远程主机克隆我的存储库 但是当尝试推送 http 或 https 时 出现以下错误
  • Azure SQL 数据仓库的简单性能测试

    我们正在努力将现有应用程序移植到 Azure SQL 数据仓库 为了更好地了解 Azure SQL 数据仓库的性能 工作负载管理特征 功能 我设置了一个我认为非常简单的测试 我加载了一个静态表 即我们企业的日历 包含大约 20k 行 即对于
  • 能够使用附近连接同时向多个设备发送消息/字节

    为了尝试附近的 API 我决定构建一个应用程序 允许老师跟踪学生在课堂上的出勤情况 类似于什么张嘉伦是在做 我已经经历了谷歌关于剪刀石头布和对讲机的示例代码 但似乎只有一个设备可以连接在任何一个时间当我使用 4 部手机测试样本时 我想构建一
  • 使用 selenium 滚动抓取 javascript 表

    我正在尝试抓取通过 javascript 生成的表格 但我很挣扎 到目前为止我的代码是 driver webdriver Chrome driver get https af ktnlandscapes com get table firs
  • 如何导出具有依赖关系的 SVN 存储库的一部分?

    我正在尝试使用迁移 SVN 存储库的一部分svnadmin dump 提供的 svndumpfilter 工具不管理导出中未包含的目录的复制 移动 重命名依赖项 有没有一个工具可以管理这些依赖关系 我发现了 Simon Tatham 的一个
  • 为每个类别选择 N 条记录并按 X 排序

    我有一个包含博客文章的数据库表 我想在主页上显示每个类别的一篇 或多篇 帖子 例如按日期排序 所以我的帖子表如下所示 id title description cat filename date 我将如何创建这样的查询 我想过使用 grou
  • 如何计算正弦曲线两端的面积

    给定这个数据集 y lt c 13 16 35 40 28 36 43 33 40 33 22 5 27 31 29 25 26 31 26 24 25 29 23 4 t lt 1 24 我的目标是计算两个面积 第一个区域将仅集成来自零线
  • 使用 Grunt Uglify 进行动态映射和连接

    我正在尝试使用动态映射并使用 Grunt Uglify 连接 Javascript 文件 我有以下无法正常工作的情况 这是我的文件夹结构 javascript account custom js bills billing one js b
  • elasticsearch:如何索引仅是停用词的术语?

    我在后台使用 elasticsearch 构建了自己的小搜索 取得了很大的成功 但有一件事我在文档中找不到 我正在索引音乐家和乐队的名字 有一个名为 The The 的乐队 由于停用词列表 该乐队从未被索引 我知道我可以完全忽略停用词列表
  • 自定义注释图像仅在程序开始时旋转(Swift-iOS)

    请在这里帮助新手 iOS 开发者 所以 我有一个计时器 它定期从提供公交车实时位置的 xml 表中获取公交车的纬度和经度 我能够设置解析器 为总线运动设置动画并为总线设置自定义 箭头 图像 然而 问题是 每次获得纬度和经度的新值时 我无法旋
  • forEach 循环中的 setTimeout

    如果满足特定条件 我想延迟调用 forEach 循环中的另一个函数 但我不理解这种情况下的 setTimeout function checkName person console log checking name of person n
  • 鼠标悬停时更改映射图像热点的背景

    我有 3 个多边形的图像图 实际的图像热点是由多条曲线和边缘组成的复杂形状 img src images map gif alt HTML Map border 0
  • Python 中“dict”的内存分配是如何工作的?

    我在玩字典时发现了这个 import sys Square1 Square2 Square3 for i in range 1 8 Square1 i i 2 for i in range 1 11 Square2 i i 2 for i