python对象内存分析
一、python内建对象
python内建对象占用内存的情况又分为定长对象与非定长对象(变长)
1.1 定长对象,对象在内存中所占大小不会变化的对象
包括int,float,long,bool,complex和dict
测试程序如下:
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys print "value\t\ttype\t\tmemsize" #int test alist=[0,1,10,-1,-444,12313] for i in alist: print "%d\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i)) #float test blist=[0.0,1.0,111.1,2323.22,-1.1] for i in blist: print "%f\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i)) #long test clist=[0l,1l,2l,-1111l,45445l] for i in clist: print "%d\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i)) #bool test dlist=[True,False] for i in dlist: print "%s\t\t%s\t\t%s"%(i,type(i),sys.getsizeof(i)) #complex test elist=[0j,1+0j,1+1j,1000-23j,-100+5j] for i in elist: print i,"\t\t%s\t\t%s"%(type(i),sys.getsizeof(i)) #dict test flist=[{},{'a':'b'},{'a':'b','c':1},{'a':'b','c':1,'d':'你好'}] for i in flist: print i,"\t\t%s\t\t%s"%(type(i),sys.getsizeof(i))
运行结果如下:
value type memsize 0 <type 'int'> 24 1 <type 'int'> 24 10 <type 'int'> 24 -1 <type 'int'> 24 -444 <type 'int'> 24 12313 <type 'int'> 24 0.000000 <type 'float'> 24 1.000000 <type 'float'> 24 111.100000 <type 'float'> 24 2323.220000 <type 'float'> 24 -1.100000 <type 'float'> 24 0 <type 'long'> 24 1 <type 'long'> 28 2 <type 'long'> 28 -1111 <type 'long'> 28 45445 <type 'long'> 28 True <type 'bool'> 24 False <type 'bool'> 24 0j <type 'complex'> 32 (1+0j) <type 'complex'> 32 (1+1j) <type 'complex'> 32 (1000-23j) <type 'complex'> 32 (-100+5j) <type 'complex'> 32 {} <type 'dict'> 280 {'a': 'b'} <type 'dict'> 280 {'a': 'b', 'c': 1} <type 'dict'> 280 {'a': 'b', 'c': 1, 'd': '\xe4\xbd\xa0\xe5\xa5\xbd'} <type 'dict'> 280
有运行结果可以看出各个定长对象所占的内存:
int和float:24
long:这个有点特殊,对于0l,python识别为long type,但是所占内存是24,除了0l所占内存为24以外,其他的都为28
complex(复数):32
dict(字典):280
1.2 变成对象,会随着对象变化所占用的内存会变化
包括:list,tuple,str
测试代码:
#/usr/bin/env python #-*- coding: utf-8 -*- import sys #str test print "str-length\ttype\tmemsize" ua='你好' ga=ua.decode('utf-8').encode('gbk') ba=ua.decode('utf-8').encode('big5') ga1=ua.decode('utf-8').encode('gb2312') alist=['','a','ab',ua,ga,ba,ga1] for s in alist: print "%d\t%s\t%s"%(len(s),type(s),sys.getsizeof(s)) print "list-length\ttype\tmemsize" #list test alist=[[],['a','b'],['abc','你好'],[11,12,'eee']] for li in alist: print "%d\t%s\t%s"%(len(li),type(li),sys.getsizeof(li)) print "%d\t%s\t%s"%(len(alist),type(alist),sys.getsizeof(alist)) #tuple test print "tuple-len\ttype\tmemsize" alist=((),('a',),('abc','你好'),(11,12,'eeee')) for tp in alist: print "%d\t%s\t%s"%(len(tp),type(tp),sys.getsizeof(tp)) print "%d\t%s\t%s"%(len(alist),type(alist),sys.getsizeof(alist))
结果:
str-length type memsize 0 <type 'str'> 37 1 <type 'str'> 38 2 <type 'str'> 39 6 <type 'str'> 43 4 <type 'str'> 41 4 <type 'str'> 41 4 <type 'str'> 41 list-length type memsize 0 <type 'list'> 72 2 <type 'list'> 88 2 <type 'list'> 88 3 <type 'list'> 96 4 <type 'list'> 104 tuple-len type memsize 0 <type 'tuple'> 56 1 <type 'tuple'> 64 2 <type 'tuple'> 72 3 <type 'tuple'> 80 4 <type 'tuple'> 88
分析结果可知:
str:空str所占内存为37,若str长度每加1,则内存所占大小相应加1
list:空列表所占内存为72,长度每增加1,则所占内存加8
tuple:空元组所占内存为56,长度每加1,所占了内存加8
空字符串为什么是37,而不是36或38,因为这里介绍所有的对像内存都为偶数,python内部维护字符串的机制和C中维护字符串的机制是一样的,即在末尾加'\0',这个占了1个字节,所以内存大小表现为36+1=37
补充:
python中还有一个比较特殊的对象,就是类型对像
>>> tlist=(int,float,long,str,complex,dict,list,tuple,bool,type) >>> for i in tlist: ... print sys.getsizeof(i) ... 872 872 872 872 872 872 872 872 872 872
类型对象也是定长的为872
基类对象object所占内存也为872
二、自建对象
测试程序:
#!/usr/bin/env python import sys class A: def __init__(self): self.value=2 def test(self): print self.value class B(object): def test(self): print "test" class C(float): def __init__(self): self.value=1 def test(self): print self.value class D(object): pass class E(A): pass print "A :%s\t%s"%(type(A),sys.getsizeof(A)) print "A():%s\t%s"%(type(A()),sys.getsizeof(A())) print "B :%s\t%s"%(type(B),sys.getsizeof(B)) print "B():%s\t%s"%(type(B()),sys.getsizeof(B())) print "C :%s\t%s"%(type(C),sys.getsizeof(C)) print "C():%s\t%s"%(type(C()),sys.getsizeof(C())) print "D :%s\t%s"%(type(D),sys.getsizeof(D)) print "D():%s\t%s"%(type(D()),sys.getsizeof(D())) print "E :%s\t%s"%(type(E),sys.getsizeof(E)) print "E():%s\t%s"%(type(E()),sys.getsizeof(E()))
结果:
A :<type 'classobj'> 104 A():<type 'instance'> 72 B :<type 'type'> 904 B():<class '__main__.B'> 64 C :<type 'type'> 904 C():<class '__main__.C'> 72 D :<type 'type'> 904 D():<class '__main__.D'> 64 E :<type 'classobj'> 104 E():<type 'instance'> 72
有结果可以看出:
A和E对象没有继承类型对象,未申明基类的情况下,类型python解释为’classobj',所占内存为104,实例化后类型为instance 内存为72
BD对象都是继承自基类object,类型为type,所占内存为904,实例化后类型为class,所占内存为64
C对象继承自类型对象 float,类型为type,所占内存为904,实例化后类型为class,所占内存为72
PS:object是所有对象的基类,python中所有对象都继承自object
相关推荐
### 浅谈Python对象内存占用 在探讨Python对象内存占用之前,我们首先需要理解Python语言的一个核心特性:**一切皆对象**。这意味着Python中的每一个元素,无论是简单的数值、布尔值还是复杂的函数,都被视为对象...
Development tool to measure, monitor and analyze the memory behavior of Python objects in a running Python application.
Python3进程内存分析器-用于运行python进程的内存分析器.zip memory_analyzer 运行内存分析器不需要您停止进程或添加任何特殊的调试代码或标志。尽管内存分析器收集有关内存中对象的信息时您的过程(及其所有线程...
4. **使用内存分析工具**:实时监控内存使用情况,辅助定位问题。 总的来说,理解和解决Python内存问题需要深入理解垃圾回收机制,熟练使用诊断工具,并具备良好的编程习惯,如及时清理不再使用的对象,避免不必要...
在第二层,Python进一步细化了内存管理,以适应Python对象的特性和需求。这一层负责Python对象的创建、销毁以及跟踪对象引用计数等操作。Python通过引用计数机制来管理对象生命周期,这意味着每个对象都有一个引用...
### Python面向对象编程知识点解析 #### 一、面向对象三大特性及作用 **1. 封装** 封装是面向对象编程中的一个重要概念,它通过隐藏类的内部细节并对外提供公共接口来保护数据的安全性和完整性。封装使得类的使用...
在这篇博客中,我将会分享关于减少 Python 内存消耗的方法和分析导致内存消耗/膨胀根源的问题。这些都是从实际操作中总结的经验,我们正在构建 Datos IO 的 RecoverX 分布式备份和恢复平台,这里主要要介绍的是在 ...
涵盖哪些主题 了解 Python 变量和数据结构在 CPython 层中的实际外观 了解小型对象分配器如何以不同于您的直觉的方式处理大多数对象 ...利用多个内存分析器逐行和随时间调查内存使用情况 还有更多
通过有效利用垃圾回收、内存复用、迭代器和生成器、列表和字典的优化,以及使用内存分析工具,我们可以编写出更高效、更稳定的Python程序。在实践中不断探索和优化这些技巧,能够显著提高程序运行速度和资源利用率,...
================面向对象和内存分析================== 086.面向对象和面向过程的区别_执行者思维_设计者思维 087.对象的进化故事 088.类的定义_类和对象的关系 089.构造函数__init__ 090.实例属性_内存分析 091....
染色方法主要应用于Python的内存管理中的对象引用检测。当一个对象不再有任何可达的引用时,它就被认为是垃圾,可以被回收。染色方法通过为内存中的对象分配特定的颜色来跟踪其引用状态。例如,如果一个对象被标记为...
根据给定的信息,本文将详细解析面向对象编程在Python中的应用与实现,涵盖Python的基本特性、类的创建、访问限制、继承与多态的概念及其应用、动态语言与静态语言的区别,以及如何获取对象信息等内容。 ### 一、...
在这种情况下,可能需要结合其他工具,如objgraph或gdb等,进行更深入的内存分析。 总的来说,Python-MemoryProfiler是Python开发者进行性能优化的有力武器。通过熟练运用它,可以提升程序的性能,减少不必要的内存...
在Python编程语言中,对象引用、可变性和垃圾回收是理解其内存管理机制的关键概念。首先,让我们深入了解对象引用。 对象引用是指一个变量指向内存中某个对象的位置,而不是存储对象的值。在Python中,当你创建一个...
`ndarray`对象的`size`属性可以获取元素个数,`ndim`表示维度,`itemsize`是每个元素的大小,`nbytes`是数组占用的内存字节数。 10. Turtle库是Python的图形绘制库,`left()`和`right()`改变Turtle的方向,`set...
在Python编程中,了解对象占用的内存大小是优化代码性能和资源管理的重要方面。...通过`sys.getsizeof()`和递归算法,我们可以深入理解Python对象在内存中的表示方式,这对于调试、性能分析和资源管理都有极大的帮助。
Python 070.函数也是对象_内存分析.mp4
Python内存管理是编程中至关重要的一个方面,它涉及到对象的创建、引用、垃圾回收和内存分配等核心概念。本文将深入探讨这些主题,并提供实例来帮助理解。 首先,Python中的对象有引用和对象之分。在`a = 1`的例子...