浅谈Python 对象内存占用


Posted in Python onJuly 15, 2016

一切皆是对象

在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数。 参见stackoverflow上的一个问题 Is everything an object in python like ruby

代码中即可以验证:

# everythin in python is object def fuction(): return print isinstance(True, object) print isinstance(0, object) print isinstance('a', object) print isinstance(fuction, object)

如何计算

Python 在 sys 模块中提供函数 getsizeof 来计算 Python 对象的大小。

sys.getsizeof(object[, default])

以字节(byte)为单位返回对象大小。 这个对象可以是任何类型的对象。 所以内置对象都能返回正确的结果 但不保证对第三方扩展有效,因为和具体实现相关。

......

getsizeof() 调用对象的 __sizeof__ 方法, 如果对象由垃圾收集器管理, 则会加上额外的垃圾收集器开销。

当然,对象内存占用与 Python 版本以及操作系统版本关系密切, 本文的代码和测试结果都是基于 windows7 32位操作系统。

import sys print sys.version

2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)]

基本类型

•布尔型

print 'size of True: %d' % (sys.getsizeof(True)) print 'size of False: %d' % (sys.getsizeof(False))

输出:

size of True: 12 size of False: 12

•整型

# normal integer print 'size of integer: %d' % (sys.getsizeof(1)) # long print 'size of long integer: %d' % (sys.getsizeof(1L)) print 'size of big long integer: %d' % (sys.getsizeof(100000L)) 输出:

size of integer: 12x size of long integer 1L: 14 size of long integer 100000L: 16

可以看出整型占用12字节,长整型最少占用14字节,且占用空间会随着位数的增多而变大。 在2.x版本,如果整型类型的值超出sys.maxint,则自动会扩展为长整型。而 Python 3.0 之后,整型和长整型统一为一种类型。

•浮点型

print 'size of float: %d' % (sys.getsizeof(1.0))

输出:

size of float: 16

浮点型占用16个字节。超过一定精度后会四舍五入。

参考如下代码:

print 1.00000000003 print 1.000000000005

输出:

1.00000000003 1.00000000001

•字符串

# size of string type print '\r\n'.join(["size of string with %d chars: %d" % (len(elem), sys.getsizeof(elem)) for elem in ["", "a", "ab"]]) # size of unicode string print '\r\n'.join(["size of unicode string with %d chars: %d" % (len(elem), sys.getsizeof(elem)) for elem in [u"", u"a", u"ab"]])

输出:

size of string with 0 chars: 21 size of string with 1 chars: 22 size of string with 2 chars: 23 size of unicode string with 0 chars: 26 size of unicode string with 1 chars: 28 size of unicode string with 2 chars: 30

普通空字符串占21个字节,每增加一个字符,多占用1个字节。Unicode字符串最少占用26个字节,每增加一个字符,多占用2个字节。

集合类型

•列表

# size of list type print '\r\n'.join(["size of list with %d elements: %d" % (len(elem), sys.getsizeof(elem)) for elem in [[], [0], [0,2], [0,1,2]]])

输出:

size of list with 0 elements: 36 size of list with 1 elements: 40 size of list with 2 elements: 44 size of list with 3 elements: 48

可见列表最少占用36个字节,每增加一个元素,增加4个字节。但要注意,sys.getsizeof 函数并不计算容器类型的元素大小。比如:

print 'size of list with 3 integers %d' % (sys.getsizeof([0,1,2])) print 'size of list with 3 strings %d' % (sys.getsizeof(['0','1','2']))

输出:

size of list with 3 integers 48 size of list with 3 strings 48

容器中保存的应该是对元素的引用。如果要准确计算容器,可以参考recursive sizeof recipe 。使用其给出的 total_size 函数:

print 'total size of list with 3 integers %d' % (total_size([0,1,2])) print 'total size of list with 3 strings %d' % (total_size(['0','1','2']))

输出为:

total size of list with 3 integers 84 total size of list with 3 strings 114

可以看出列表的空间占用为 基本空间 36 + (对象引用 4 + 对象大小) * 元素个数。

另外还需注意如果声明一个列表变量,则其会预先分配一些空间,以便添加元素时增加效率:

li = [] for i in range(0, 101): print 'list with %d integers size: %d, total_size: %d' % (i, getsizeof(li), total_size(li)) li.append(i)

•元组

基本与列表类似,但其最少占用为28个字节。

•字典

字典的情况相对复杂很多,具体当然要参考代码 dictobject.c, 另外 NOTES ON OPTIMIZING DICTIONARIES 非常值得仔细阅读。

基本情况可以参考[stackoverflow] 的问题 Python's underlying hash data structure for dictionaries 中的一些回答:

•字典最小拥有8个条目的空间(PyDict_MINSIZE);
•条目数小于50,000时,每次增长4倍;
•条目数大于50,000时,每次增长2倍;
•键的hash值缓存在字典中,字典调整大小后不会重新计算;

每接近2/3时,字典会调整大小。

以上这篇浅谈Python 对象内存占用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
python如何在终端里面显示一张图片
Aug 17 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
pandas 透视表中文字段排序方法
Nov 16 Python
分析经典Python开发工程师面试题
Apr 08 Python
Python 去除字符串中指定字符串
Mar 05 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
Python 高效编程技巧分享
Sep 10 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
python发送邮件功能实现代码
Jul 15 #Python
Python中列表和元组的使用方法和区别详解
Dec 30 #Python
Python中的变量和作用域详解
Jul 13 #Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 #Python
举例讲解Python编程中对线程锁的使用
Jul 12 #Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 #Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 #Python
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python def 定义函数,调用函数方式
2020/06/02 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
悬挂训练绳:TRX
2017/12/14 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
职务聘任书范文
2014/03/29 职场文书
行政内勤岗位职责
2014/04/07 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
承租经营合作者协议书
2014/10/01 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android