list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置,

v引用变量名称,v[:]引用list对象,此规则对python其他序列结构也成立,以下示范可用id佐证,

a=b时,a和b指向同一个list对象

a=b[:]时,a的list对象和b的list对象指向同一个list内容

Q1:元素存储地址是否连续

首先见得的测试一下list对象存储的内容(结构3)的内存地址,

In [1]: a=[1,2,3,‘a‘,‘b‘,‘c‘,‘de‘,[4,5]]

In [2]: id(a)

Out[2]: 139717112576840

In [3]: for i in a:

...: print(id(i))

...:

139717238769920

139717238769952

139717238769984

139717239834192

139717240077480

139717240523888

139717195281104

139717112078024

In [4]: for i in a[6]:

...: print(id(i))

...:

139717240220952

139717240202048

In [5]: for i in a[7]:

...: print(id(i))

...:

139717238770016

139717238770048

然后看一下相对地址,

In [6]: for i in a:

...: print(id(i)-139717238769920)

...:

0

32

64

1064272

1307560

1753968

-43488816

-126691896

In [7]: for i in a[6]:

...: print(id(i)-139717238769920)

...:

1451032

1432128

In [8]: for i in a[7]:

...: print(id(i)-139717238769920)

...:

96

128

可见,对于list对象,其元素内容并不一定线性存储,但是由于内存分配的问题,会出现线性存储的假象,当元素出现容器或者相对前一个元素类型改变时,内存空间就会不再连续。

Q2:list对象地址和元素地址是否连续

其实Q1已经回答了这个问题,毕竟元素地址本身就不连续,不过我们还是测试了一下,

In [22]: id(a[0])-id(a)

Out[22]: 126193080

相差甚远,而且我们分析源码可知,list对象主体是一个指针数组,也就是id(a)所指的位置主体是一个指向元素位置的指针数组,当然还有辅助的对象头信息之类的(python中几个常见的“黑盒子”之 列表list)。

Q3:list对象(不含元素)占用内存情况分析

In [16]: sys.getsizeof([1,2,3,‘a‘,‘b‘,‘c‘,‘de‘])

Out[16]: 120

In [17]: sys.getsizeof([1,2,3,‘a‘,‘b‘,‘c‘])

Out[17]: 112

In [18]: sys.getsizeof([1,2,3,‘a‘,‘b‘])

Out[18]: 104

可见,list每一个对象占用8字节32位空间,我们来看切片,

In [20]: sys.getsizeof(a[:3])

Out[20]: 88

In [21]: sys.getsizeof(a[:4])

Out[21]: 96

In [23]: sys.getsizeof(a[3:4])

Out[23]: 72

In [24]: sys.getsizeof(a[3:5])

Out[24]: 80

切片对象也是每个元素占8字节,但是切片也是list对象,即使从中间切(不切头),也会包含头信息的存储占用。

附注

1、[0]和[:1]的不同

In [30]: a[0]

Out[30]: 1

In [31]: a[:1]

Out[31]: [1]

2、空list占用空间

In [32]: sys.getsizeof([])

Out[32]: 64

python查看对象占用内存_『Python』内存分析_List对象内存占用分析相关推荐

  1. linux下运行python程序如何控制内存_用Python实现Linux系统占用指定内存,CPU满载,服务器压力测试,场景设计...

    背景 提出两个需求 占满系统CPU 占用大内存 通过上网查资料,做实验使用Python实现了上述两个需求. 先看效果 执行前 内存 CPU 执行后 内存 CPU 代码实现 环境说明:代码使用Pytho ...

  2. python gc内存_禁用 Python GC,Instagram 性能提升10%

    通过关闭 Python 垃圾收集(GC)机制,该机制通过收集和释放未使用的数据来回收内存,Instagram 的运行效率提高了 10 %.是的,你没听错!通过禁用 GC,我们可以减少内存占用并提高 C ...

  3. python 内存_一行Python解决内存问题

    原标题:一行Python解决内存问题 内存不足是项目开发过程中经常碰到的问题,我和我的团队在之前的一个项目中也遇到了这个问题,我们的项目需要存储和处理一个相当大的动态列表,测试人员经常向我抱怨内存不足 ...

  4. 将整数k转换成实数python表达式_『Python基础-5』数字,运算,转换

    『Python基础-5』数字,运算,转换 目录 基本的数字类型 二进制,八进制,十六进制 数字类型间的转换 数字运算 1. 数字类型 Python 数字数据类型用于存储数学上的值,比如整数.浮点数.复 ...

  5. python字典的存储结构_解决python字典结构内存暴涨问题

    背景:当读取一个key value数据的时候,python的字典结构会造成内存使用扩10倍左右,无可容忍.此文解决这个问题 数据:word2vec训练的结果,word对应400维的词向量.词表共1.6 ...

  6. python的pyaudio教程入门_『开发技巧』Python音频操作工具PyAudio上手教程

    『开发技巧』Python音频操作工具PyAudio上手教程 ​ 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...

  7. python中response对象的属性_关于python:AttributeError:’HTTPResponse’对象没有属性’split’...

    我正在尝试从Google财经获取一些信息,但出现此错误 AttributeError: 'HTTPResponse' object has no attribute 'split' 这是我的pytho ...

  8. python处理音频的软件_『开发技巧』Python音频操作工具PyAudio上手教程

    『开发技巧』Python音频操作工具PyAudio上手教程 ​ 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...

  9. python什么时候用框架_关于python:框架和对象之间有什么区别,什么时候应该修改另一个?...

    我开始阅读python的+=语法,无意中发现了以下文章/答案:关于的交互式代码+= 所以我注意到帧和对象之间似乎有区别. . 在全局框架中,它们指向同一对象,即使它们是不同的变量:如果 l2 += [ ...

最新文章

  1. 自定义数字格式字符串输出示例
  2. 设计模式 - 基本功的重要性
  3. 官宣:神策数据证券行业解决方案,全新上线官网!
  4. JVM详解之:汇编角度理解本地变量的生命周期
  5. 汽车行业中的AUTOSAR与OSEK到底是什么,有什么区别
  6. pyinstaller---将py文件打包成exe
  7. java和python哪个学习编程_初学编程,选Java还是Python?
  8. window下远程监控linux下tomcat的jvm
  9. 前端基础-html-路径的介绍
  10. 栈溢出笔记1.6 地址问题(1)
  11. qt 增加的翻译没有作用上_Qt翻译文件使用方法
  12. keil中下载按钮和调试按钮灰掉了
  13. SQL Server BI Step by step 1 AdventureWorks数据库的安装
  14. nmap超快高效扫描端口
  15. mysql间隙锁_mysql的间隙锁
  16. (二)mybatisPlus实现ActiveRecord(AR)操作
  17. 【后端】--process information unavailable解决办法[详细版]
  18. 计算机和机械类哪个工资高,机械类专业就业方向 哪个方向工资高
  19. LeetCode849. 到最近的人的最大距离
  20. POJ - 2008 Moo University - Team Tryouts

热门文章

  1. 亲测 asp.net 调用 webservice返回json
  2. Android开发--apk的生成
  3. CentOS Linux解决Device eth0 does not seem to be present【转】
  4. Android4.0升级新特性
  5. TextBoxWatermarkExtender扩展器与RequiredFieldValidator控件相冲突的解决方案
  6. BC之旅(13) — 农庄的残冬
  7. python3.8.4rc1_Python3.8.4rc1 官方正式版
  8. java中找不到javax包_logstash 找不到 java 环境
  9. maven netty 配置_使用Springboot整合开发Netty(一个表白的小案例)
  10. 金蝶k3财务接口_记录用友T+接口对接的心酸历程