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

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

字典

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

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

>>> x = ob['x']

>>> ob['y'] = y

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

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

240

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

解决方案

用类实例来代替字典:

class Point:

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

self.x = x

self.y = y

self.z = z

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

>>> x = ob.x

>>> ob.y = y

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

如果你不是很了解类和实例,可以看廖雪峰的这篇文章。这里的__weakref__是对这个对象的弱引用列表的引用,而__dict__是对类实例字典的引用,它包含实例属性的值。从Python 3.3开始, 类的所有实例用共享空间存储字典的keys. 这减少了内存中实例的大小:

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

56 112

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

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

带__slots__的类实例

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

class Point:

__slots__ = 'x', 'y', 'z'

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

self.x = x

self.y = y

self.z = z

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

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

64

RAM中的对象明显变小:

FieldSize (bytes)PyGC_Head24PyObject_HEAD16x8y8z8TOTAL:64

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

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

文章到此就结束啦,如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦

有任何问题都可以在下方留言区留言,我们会耐心解答的!

​Python实用宝典 (pythondict.com)

不只是一个宝典

欢迎关注公众号:Python实用宝典

python字典内存分析_Python减少字典对象占用的七成内存相关推荐

  1. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  2. [转载] python里字典的用法_python中字典(Dictionary)用法实例详解

    参考链接: Python字典dictionary copy方法 本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映 ...

  3. python 内存分析_python内存管理分析

    本文较为详细的分析了python内存管理机制.分享给大家供大家参考.具体分析如下: 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在 ...

  4. python字典操作技巧_python的字典使用方法大全

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 . 键一般是唯一的,如 ...

  5. python如何读取字典的关键字_python提取字典元素

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一本字典d = {1:-0.3246, 2:-0.9185, 3:-3985 ...

  6. python程序内存分析_python 如何测量运行中的程序内存 -- Valgrind

    介绍 通常我们可以用python profiler去分析应用程序中哪个模块被多次调用和那个程序部分运行的速度较为缓慢,但是并不能够准确给出我们应用程序在运行中在内存中占用的大小. 比如说在金融数据中会 ...

  7. python dictionary怎么用_python Dictionary字典使用

    一.dictionary数据类型的结构是:{key1:value1, key2:value2, ...},即键值对.字典的健必须是不可更改的类型,如字符串.数字.元祖等:而值则可以是任意的数据类型,而 ...

  8. python字典转换为列表_Python中将字典转换为列表的方法

    说明:列表不可以转换为字典 ①转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()) p ...

  9. python 字典 删除指定_python删除字典中的某个值

    Q1:python中字典不用了怎么删除 如果你要删除整个变量,python里面垃圾是自动收集的,不用你太去关心.一定要用,就del 变量名. 如果你是要修改一个字典的内容,比如从里面删除一个元素,一般 ...

最新文章

  1. WebApi2 知识点总结
  2. 如何在CentOS/RHEL 7上借助ssm管理LVM卷?
  3. C# 7.2和8.0路线图
  4. GMM_example(3)
  5. 实现点击到底部、顶部、指定div功能
  6. 换个姿势为安装包重签名
  7. [Azure] Notification Hubs注册模式
  8. python学习笔记列表和元组(三)
  9. sql server 创建唯一性非聚集索引语句_数据库专题—索引原理
  10. 给vmware虚拟机中的ubuntu 14.04扩大磁盘分区
  11. ssh非交互式远程命令
  12. 文本处理3剑客 sed命令
  13. 编程的未来 Java, C, Go, Swift, Dart? Uncle Bob Martin - The Future of Programming
  14. Ant安装与配置build.xml文件说明
  15. (转载)New poker 2总算放出新固件了!
  16. 怎么查看linux系统硬盘,Linux系统下如何查看所有存储设备(磁盘分区)
  17. 微信小程序组件、路由、组件通信、侦听器
  18. 2的立方根用计算机怎样摁,立方根练习2doc用计算器求立方根.doc
  19. Initialization failed for ‘https://start.spring.io
  20. 分享一些实用的小工具(Windows版)

热门文章

  1. [翻译]Chameleon介绍(3) : 列表控件
  2. ARM中Bus Error的测试
  3. 头文件的查找方式和库的搜索路径
  4. Leetcode62 DP
  5. cmd命令打开文本文档_震惊!我竟然通过控制台打开了QQ!
  6. before css 旋转_七夕,当然少不了纯CSS的点缀啦
  7. 哈希链表的原理及算法实现
  8. 返回数据给上一个活动
  9. java小程序连接数据库_Java程序连接各种数据库的方法
  10. python 实现函数的递归