为什么Python2.7 dict比Python3 dict使用更多空间?

2024-01-02

我读过关于雷蒙德·赫廷格的新方法 https://mail.python.org/pipermail/python-dev/2012-December/123028.html实施的紧凑词典 https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-compactdict。这解释了为什么 Python 3.6 中的字典比 Python 2.7-3.5 中的字典使用更少的内存。然而,Python 2.7 和 3.3-3.5 字典中使用的内存似乎存在差异。测试代码:

import sys

d = {i: i for i in range(n)}
print(sys.getsizeof(d))
  • Python 2.7:12568
  • Python 3.5:6240
  • Python 3.6:4704

如前所述,我了解 3.5 到 3.6 之间的节省,但很好奇 2.7 到 3.5 之间节省的原因。


事实证明这是一条红鲱鱼。增加字典大小的规则在 cPython 2.7 - 3.2 和 cPython 3.3 之间发生了变化,在 cPython 3.4 中又发生了变化(尽管此更改仅在发生删除时适用)。我们可以使用以下代码来确定字典何时扩展:

import sys

size_old = 0
for n in range(512):
    d = {i: i for i in range(n)}
    size = sys.getsizeof(d)
    if size != size_old:
        print(n, size_old, size)
    size_old = size

Python 2.7:

(0, 0, 280)
(6, 280, 1048)
(22, 1048, 3352)
(86, 3352, 12568)

Python 3.5

0 0 288
6 288 480
12 480 864
22 864 1632
44 1632 3168
86 3168 6240

Python 3.6:

0 0 240
6 240 368
11 368 648
22 648 1184
43 1184 2280
86 2280 4704

请记住,字典在达到 2/3 满时会调整大小,我们可以看到 cPython 2.7 字典实现在扩展时大小会增加四倍,而 cPython 3.5/3.6 字典实现大小仅增加一倍。

这在评论中进行了解释字典源代码 https://github.com/python/cpython/blob/master/Objects/dictobject.c#L401:

/* GROWTH_RATE. Growth rate upon hitting maximum load.
 * Currently set to used*2 + capacity/2.
 * This means that dicts double in size when growing without deletions,
 * but have more head room when the number of deletions is on a par with the
 * number of insertions.
 * Raising this to used*4 doubles memory consumption depending on the size of
 * the dictionary, but results in half the number of resizes, less effort to
 * resize.
 * GROWTH_RATE was set to used*4 up to version 3.2.
 * GROWTH_RATE was set to used*2 in version 3.3.0
 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Python2.7 dict比Python3 dict使用更多空间? 的相关文章

  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 类型错误:只能使用标量值执行操作

    如果您能让我知道如何为所提供的表格绘制一些信息丰富的图表 我将不胜感激here https www iasplus com en resources ifrs topics use of ifrs 例如 我需要一个名为 国内非上市公司 非上
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 删除重复项及其内在价值[重复]

    这个问题在这里已经有答案了 假设下一个向量 just a random vector lt c A B B C C D 这个想法是 如果某个值有重复项 则删除所有重复值和该值本身 为了得到看起来像这样的东西 A D 有什么办法可以得到上面的
  • D3.js 醉酒工具提示

    D3 js 能够支持醉酒提示吗 如果可能的话 有人可以给我举个例子吗 谢谢 这是一个工作示例 使用 jQuery Tipsy 的 D3 工具提示 http bl ocks org 1373263
  • 像 @Override 这样的注释在 Java 内部是如何工作的?

    谁能向我解释一下 java 内部注释是如何工作的 我知道如何使用 java 中的 java lang annotation 库创建自定义注释 但我仍然不明白它的内部工作原理 例如 Override 注释 如果有人能详细解释这一点 我将非常感
  • 将图像源设置为 URI

    如果我有一个在线图像的链接 并且我想将图像源设置为此 uri 我应该如何做最好 我正在尝试的代码如下所示
  • 一段时间后更改文档中的变量值?

    我对网络开发很陌生 我想学习新东西 我有一个猫鼬模式 我不会发布它 因为它是用我自己的语言写的 你不会理解 所以我会解释 所以我有诸如名称 代码 创建条目的用户等信息 与我的问题无关 我有一个变量 比如说日期 如下所示 type Date
  • 使用 numpy 在 Python 中导入 nastran 节点套牌

    如果我想将 Nastran Deck 导入到 Python 数组中 可以使用 numpy 一次性完成 我该怎么办呢 我哪里错了 我有一个仅包含网格的文件 网格均与 Nastran 的短翻译器等距 8 个字符 MH Nodes 2345678
  • Jquery从左到右的动画宽度

    我正在尝试对菜单元素进行动画处理 在鼠标悬停时将宽度从 170 像素缩小到 150 像素 我的问题是 默认的 animate 收缩发生在矩形的右侧 我需要它在左侧收缩 我已经尝试过对左边距进行动画处理 但由于元素内部有文本 因此它在动画过程
  • log4j2 中增强的 Throwable 渲染器

    log4j2 中是否存在与增强型 Throwable Renderer 类 存在于 log4j1 中 等效的类 我正在将一个库迁移到 log4j2 但我没有看到 log4j2 支持此功能 任何帮助表示赞赏 在 log4j2 中 图案布局 h
  • 加载多个属性文件

    Java 中是否可以堆叠加载的属性 例如我可以这样做 Properties properties new Properties properties load new FileInputStream file1 properties pro
  • .NET mvc3 验证最小长度,但不是必需的

    我目前正在使用 MVC 数据注释对我的模型执行验证 MinLength 4 ErrorMessage The 0 must be at least 2 characters long MaxLength 16 ErrorMessage Th
  • 使用 ASP.NET MVC 的多语言 URL

    我正在制定一个新项目的概念 我需要支持多语言 URL 理想情况下 所有 URL 都需要使用用户的母语 所以我们不想使用domain com en contact and 域名 com es contact但我们喜欢域名 com contac
  • 简单的 css :before:hover 不起作用? CSSlint 没有错误?

    http jsfiddle net nicktheandroid k93ZK 2 http jsfiddle net nicktheandroid k93ZK 2 这应该非常简单 我只是不明白为什么它不起作用 当鼠标悬停在 before它应
  • android中无法构建react-native-push-notification

    我将在我的应用程序中使用react native push notification作为通知 但是当我使用这个库时 它会给我这样的错误 gt Task react native push notification compileDebugJ
  • 在 numpy 中对二进制值进行热编码

    我有一个 numpy 数组 如下所示 array 0 1 1 我希望它被表示为一个热编码的等价物 array 1 0 0 1 0 1 任何机构有任何想法吗 我尝试使用sklearn preprocessing LabelBinarizer
  • 在 Node.js 服务器上使用 supertest/superagent 读取响应输出缓冲区/流

    我正在尝试编写一个测试来检查 API 路由是否输出内容正确的 ZIP 文件 我正在使用 mocha 和 supertest 进行测试 我想实际读取输出流 缓冲区 读取 zip 文件内容并查看内容是否正确 有什么想法我应该怎么做 当我尝试阅读
  • 失败是因为原生 React 运行时不包含 Node 标准库

    包裹位于node modules crypto js core js尝试导入Node标准库模块crypto 它失败了 因为本机 React 运行时不包含 Node 标准库 阅读更多内容https docs expo io workflow
  • SQLite 和 JDBC:返回 UnsatisfiedLinkError

    我在 VirtualBox 中运行 Xubuntu 我安装了 sqlite3 由于某种原因 它不再捆绑 我将 sqlite jdbc 3 8 7 jar 添加到我的构建路径中 并运行这个简单的代码来测试它 import java sql p
  • 如何从jtable中连续勾选的jcheckbox获取值

    我有一个包含 3 列和基于数据库值的动态行的表 最后一列中有一个基于以下代码的 jcheckbox TableColumn tcolumn tabel getColumnModel getColumn 2 tcolumn setCellRe
  • jQuery回调问题

    我试图为 jquery 中的不同回调函数分配不同的数字 for i o i
  • 为什么Python2.7 dict比Python3 dict使用更多空间?

    我读过关于雷蒙德 赫廷格的新方法 https mail python org pipermail python dev 2012 December 123028 html实施的紧凑词典 https docs python org 3 wha