0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python减少字典对象内存大小的方法

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-03 15:21 次阅读

程序执行过程中,如果RAM中有大量的对象在运行,就可能会出现内存问题,特别是在对可用内存总量有限的情况下。

下面是一些减少字典对象内存大小的方法,这些方法可以显著减少对象所需的RAM大小。

字典

Python里用字典来表示结构信息是非常方便的:

  1. >>> ob ={'x':1,'y':2,'z':3}

  2. >>> x = ob['x']

  3. >>> ob['y']= y

但我们来看看它的内存消耗:

  1. >>>print(sys.getsizeof(ob))

  2. 240

这个数额看起来好像挺小,但是当你想要创造许多这样的变量时就积少成多了:

对象数目内存大小
1 000 000240 Mb
10 000 0002.40 Gb
100 000 00024 Gb

解决方案

用类实例来代替字典:

  1. classPoint:

  2. def __init__(self, x, y, z):

  3. self.x = x

  4. self.y = y

  5. self.z = z

  6. >>> ob =Point(1,2,3)

  7. >>> x = ob.x

  8. >>> ob.y = y

类实例各个部分的内存大小:

FieldSize (bytes)
PyGC_Head24
PyObject_HEAD16
weakref8
dict8
TOTAL:56

如果你不是很了解类和实例,可以看廖雪峰的这篇文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408

这里的__weakref__是对这个对象的弱引用列表的引用,而__dict__是对类实例字典的引用,它包含实例属性的值。从Python 3.3开始, 类的所有实例用共享空间存储字典的keys. 这减少了内存中实例的大小:

  1. >>>print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))

  2. 56 112

56+112=168 < 240. 因此,大量的类实例占用的内存比普通字典(dict)要少:

实例数目大小
1 000 000168 Mb
10 000 0001.68 Gb
100 000 00016.8 Gb

字典占实例大小的百分比为112/168=67%, 我们还是可以看出,实例中字典的大小严重影响了RAM中实例的大小。下面有更好的方法。

带__slots__的类实例

通过消除__dict__和weakref__,可以显著减少RAM中的类实例的大小。用__slots__是有可能做到的:

  1. classPoint:

  2. __slots__ ='x','y','z'

  3. def __init__(self, x, y, z):

  4. self.x = x

  5. self.y = y

  6. self.z = z

  7. >>> ob =Point(1,2,3)

  8. >>>print(sys.getsizeof(ob))

  9. 64

RAM中的对象明显变小:

FieldSize (bytes)
PyGC_Head24
PyObject_HEAD16
x8
y8
z8
TOTAL:64

今日重点:在类定义中使用__slots__会显著减少大量实例的内存占用

实例数目大小
1 000 00064 Mb
10 000 000640 Mb
100 000 0006.4 Gb

目前,这是大幅度减少RAM中类实例的内存占用的主要方法。相比于单纯用字典,减少了(240-64)/240= 73% 的内存占用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72767
  • 字典
    +关注

    关注

    0

    文章

    13

    浏览量

    7671
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83467
  • 储存
    +关注

    关注

    3

    文章

    184

    浏览量

    22283
收藏 人收藏

    评论

    相关推荐

    Python元组和字典使用的基本方法

    Python学习:2、元组、字典使用的基本方法
    发表于 04-06 15:12

    STM32F103xx系列内存大小

    写在前面:本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。目录一、内存大小二、STM32F103xx
    发表于 08-19 08:53

    python字典

    ': '张三'}3. 重要方法判断key是否存在在 Python 2 中的字典对象有一个 has_key 函数,可以用来判断一个 key 是否在该
    发表于 02-23 16:54

    HarmonyOS如何获取系统内存大小和可用内存

    解决方案Harmony获取内存大小和Android类似的系统。SystemMemoryInfo systemMemoryInfo = new SystemMemoryInfo
    发表于 03-15 14:46

    python合并字典的 7 种方法

    1、最简单的原地更新字典对象内置了一个 update 方法,用于把另一个字典更新到自己身上。>>> profile = {"name": "
    发表于 04-08 15:11

    python中的字典(dict)对象以及其使用方法

    本文通过以英文的形式全面讲解了python中的字典(dict)对象以及其使用方法
    发表于 05-15 10:00 1次下载

    电脑内存大小怎么查看

    日常办公或者玩游戏的时候,都需要确认一下电脑内存够不够运行将要办公的软件或者将要玩游戏的软件,问题来了,怎么查看电脑内存大小?现在给大家带来怎么查看电脑内存大小教程。
    发表于 05-27 10:13 2923次阅读

    Linux:测试进程占用的虚拟内存大小

    Linux:测试进程占用的虚拟内存大小
    的头像 发表于 06-23 09:23 2636次阅读
    Linux:测试进程占用的虚拟<b class='flag-5'>内存大小</b>

    测试不同内存大小对M1处理器的影响

    现在,有国外博主做了一个有趣的视频,主要是来对比不同内存大小,对M1处理器的影响。
    的头像 发表于 11-24 09:21 2274次阅读

    python字典是什么

    等 值,则可以是任意对象 1. 创建字典 创建一个字典有三种方法 第一种方法 :先使用 dict() 创建空
    的头像 发表于 02-23 16:54 2674次阅读

    python实现合并字典方法

    字典对象内置了一个 update 方法,用于把另一个字典更新到自己身上。
    的头像 发表于 04-08 15:11 842次阅读

    Python序列的字典类型介绍

    字典 介绍 字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。 可以通过“键
    的头像 发表于 03-08 17:35 965次阅读
    <b class='flag-5'>Python</b>序列的<b class='flag-5'>字典</b>类型介绍

    Go高性能-两种内存大小为0的数据类型

    Go 中的空结构体 struct{}{} 的内存大小等于 0,除此之外,还有别的数据类型内存大小也等于 0 吗?
    的头像 发表于 05-22 17:33 503次阅读

    weblogic设置jvm内存大小

    WebLogic是一种Java EE应用服务器,用于构建和部署企业级Java应用程序。在配置WebLogic服务器时,设置JVM的内存大小非常重要,这可以提高应用程序的性能和可靠性。本文将详细介绍
    的头像 发表于 12-05 14:44 1231次阅读

    eclipse设置jvm内存大小

    内存大小,并对其背后的原理进行解释。 JVM(Java虚拟机)是Java程序的运行环境,它负责将Java字节码翻译成机器码,以便在不同的平台上执行。JVM使用内存来存储运行时对象和执行过程中的临时数据。如果JVM的
    的头像 发表于 12-06 11:43 741次阅读