python看对象占用多少内存python查看对象的内存地址

从PyObject的定义中我们知道,每个对象的 ob_type 都要指向一个具体的类型对象,比如一个数值型对象 100 ,它的ob_type会指向 int类型对象PyLong_Type 。PyTypeObject结构体第一行是一个PyObject_VAR_HEAD宏,查看宏定义可知PyTypeObject是一个变长对象 也就是说,归根结底 类型对象也是一个对象 ,...
python看对象占用多少内存python查看对象的内存地址
本篇文章给大家谈谈python看对象占用多少内存,以及python查看对象的内存地址对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、Python对象2、python 内存占用分析工具3、使用 sys.getsizeof 查看 python 对象的内存占用4、如何估算一个Python对象的内存占用5、python创建类占用内存Python对象众所周知,Python是一门面向对象的语言,在Python无论是数值、字符串、函数亦或是类型、类,都是对象。
对象是在 堆 上分配的结构,我们定义的所有变量、函数等,都存储于堆内存,而变量名、函数名则是一个存储于 栈 中、指向堆中具体结构的引用。
要想深入学习Python,首先需要知道Python对象的定义。
我们通常说的Python都是指CPython,底层由C语言实现,源码地址: cpython [GitHub]
Python对象的定义位于 Include/object.h ,是一个名为 PyObject 的结构体:
Python中的所有对象都继承自PyObejct,PyObject包含一个用于垃圾回收的双向链表,一个引用计数变量 ob_refcnt 和 一个类型对象指针 ob_type
从PyObejct的注释中,我们可以看到这样一句:每个指向 可变大小Python对象 的指针也可以转换为 PyVarObject* (可变大小的Python对象会在下文中解释)。 PyVarObejct 就是在PyObject的基础上多了一个 ob_size 字段,用于存储元素个数:
在PyObject结构中,还有一个类型对象指针 ob_type ,用于表示Python对象是什么类型,定义Python对象类型的是一个 PyTypeObject 接口体
实际定义是位于 Include/cpython/object.h 的 _typeobject :
在这个类型对象中,不仅包含了对象的类型,还包含了如分配内存大小、对象标准操作等信息,主要分为:
以Python中的 int类型 为例,int类型对象的定义如下:
从PyObject的定义中我们知道,每个对象的 ob_type 都要指向一个具体的类型对象,比如一个数值型对象 100 ,它的ob_type会指向 int类型对象PyLong_Type 。
PyTypeObject结构体第一行是一个PyObject_VAR_HEAD宏,查看宏定义可知PyTypeObject是一个变长对象
也就是说,归根结底 类型对象也是一个对象 ,也有ob_type属性,那 PyLong_Type 的 ob_type 是什么呢?
回到PyLong_Type的定义,第一行 PyVarObject_HEAD_INIT(PyType_Type, 0) ,查看对应的宏定义
由以上关系可以知道, PyVarObject_HEAD_INIT(PyType_Type, 0)={ { _PyObject_EXTRA_INIT 1, PyType_Type } 0} ,将其代入 PyObject_VAR_HEAD ,得到一个变长对象:
这样看就很明确了,PyLong_Type的类型就是PyType_Typ,同理可知, Python类型对象的类型就是PyType_Type ,而 PyType_Type对象的类型是它本身
从上述内容中,我们知道了对象和对象类型的定义,那么根据定义,对象可以有以下两种分类
Python对象定义有 PyObject 和 PyVarObject ,因此,根据对象大小是否可变的区别,Python对象可以划分为 可变对象(变长对象) 和 不可变对象(定长对象)
原本的对象a大小并没有改变,只是s引用的对象改变了。这里的对象a、对象b就是定长对象
可以看到,变量l仍然指向对象a,只是对象a的内容发生了改变,数据量变大了。这里的对象a就是变长对象
由于存在以上特性,所以使用这两种对象还会带来一种区别:
声明 s2 = s ,修改s的值: s = 'new string' ,s2的值不会一起改变,因为只是s指向了一个新的对象,s2指向的旧对象的值并没有发生改变
声明 l2 = l ,修改l的值: l.append(6) ,此时l2的值会一起改变,因为l和l2指向的是同一个对象,而该对象的内容被l修改了
此外,对于 字符串 对象,Python还有一套内存复用机制,如果两个字符串变量值相同,那它们将共用同一个对象:
对于 数值型 对象,Python会默认创建0~2 8以内的整数对象,也就是 0 ~ 256 之间的数值对象是共用的:
按照Python数据类型,对象可分为以下几类:
Python创建对象有两种方式,泛型API和和类型相关的API
这类API通常以 PyObject_xxx 的形式命名,可以应用在任意Python对象上,如:
使用 PyObjecg_New 创建一个数值型对象:
这类API通常只能作用于一种类型的对象上,如:
使用 PyLong_FromLong 创建一个数值型对象:
在我们使用Python声明变量的时候,并不需要为变量指派类型,在给变量赋值的时候,可以赋值任意类型数据,如:
从Python对象的定义我们已经可以知晓造成这个特点的原因了,Python创建对象时,会分配内存进行初始化,然后Python内部通过 PyObject* 变量来维护这个对象,所以在Python内部各函数直接传递的都是一种泛型指针 PyObject* ,这个指针所指向的对象类型是不固定的,只能通过所指对象的 ob_type 属性动态进行判断,而Python正是通过 ob_type 实现了多态机制
Python在管理维护对象时,通过引用计数来判断内存中的对象是否需要被销毁,Python中所有事物都是对象,所有对象都有引用计数 ob_refcnt 。
当一个对象的引用计数减少到0之后,Python将会释放该对象所占用的内存和系统资源。
但这并不意味着最终一定会释放内存空间,因为频繁申请释放内存会大大降低Python的执行效率,因此Python中采用了内存对象池的技术,是的对象释放的空间会还给内存池,而不是直接释放,后续需要申请空间时,优先从内存对象池中获取。
python 内存占用分析工具pip install memory_profiler
pip install psutil
pip install matplotlib
使用方法
from memory_profiler import profile
@profile(precision=4, stream=open('test.log', 'w+'))
def test(args: List):
...
运行:
python3 test.py
Mem usage:表示执行该行后Python解释器的内存使用情况
Increment:表示当前行的内存相对于上一行的差异,即自己本身增长了多少,如果减少了则不显示.
使用 sys.getsizeof 查看 python 对象的内存占用使用sys.getsizeof方法可以查看 python 对象的内存占用,单位:字节 (byte)
实际上是调用了__sizeof__方法:
有些数据类型在 Python3 和 Python2 中占用的内存是不同的,例如range:
关于这个值是怎么算出来的,有待研究~
暂时已知:这个值包括该对象的数值、签名(包括数据类型、参数、调用方式等)等一系列数据所占总内存。可变对象所占内存可能极小,因为对象是指针,指向很大的数据。
如何估算一个Python对象的内存占用如果想自己写程序来实现的话,可以参考它们的源码。
top/free都是在procps包中(apt-get source procps)。
找到cpus_refresh()函数,你可以看到它是怎样从/proc/stat解析出CPU的使用率的。meminfo()函数则展示了如何从/proc/meminfo解析出内存的使用率(这个文件自己解析也很简单)。
python创建类占用内存2g。python创建类占用内存有2g。Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。
关于python看对象占用多少内存和python查看对象的内存地址的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
2024-09-19
mengvlog 阅读 8 次 更新于 2025-07-19 09:45:23 我来答关注问题0
  • 1、Python对象2、python 内存占用分析工具3、使用 sys.getsizeof 查看 python 对象的内存占用4、如何估算一个Python对象的内存占用5、python创建类占用内存Python对象众所周知,Python是一门面向对象的语言,在Python无论是数值、字符串、函数亦或是类型、类,都是对象。对象是在 堆 上分配的结构,我们定...

  •  瑞物评测室 python中sizeof的用法

    首先,需要明确的是,Python标准库中并没有直接提供`sizeof`这个函数。然而,在Python的扩展模块如`sys`中,存在一个`getsizeof`函数,它可以用来获取对象在内存中占用的字节数。这通常被用作类似“sizeof”的功能。关于`sys.getsizeof`函数,它接受一个对象作为参数,并返回该对象在内存中...

  •  文暄生活科普 性能测试,python 内存分析工具 -memray

    Memray的安装和使用相对简单,只需运行命令:python3 -m memray --help以获取详细帮助信息。在使用Memray时,可以通过以下命令执行分析:memray-py文件名.进程id.bin,进而将分析结果转换为HTML格式的火焰图报告,直观展示程序调用过程中的内存分配情况,宽度表示函数占用内存的多少。值得注意的是,使用火...

  •  shqzzy python 查看变量占用了多少内存

    s = 'abc'print sys.getsizeof(s)如果你要监测所有的变量,可以用python的smiley 模块监测所有的内存变量情况

  •  猪八戒网 python代码占用内存多少(python内存占用)

    python占内存大吗你是问python的安装包嘛,如果是的话大概29M左右就够了,不怎么占内存。python最大能用多大内存最大能用多大内存是操作系统的限制,跟python没有直接关系,因为python是没有限制的。ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序...

檬味博客在线解答立即免费咨询

报错相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部