Python内存分析

内存机制

转述:内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。

Python的内存机制和Java差不多,分为i栈内存区、堆内存区、常量区、数据区

换一句别人的话来说:内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区

栈内存区

栈内存(Stack):栈内存比较小,但是速度快。一般存储运行方法的形参、局部变量、返回值。由系统自动分配和回收

堆内存

堆内存(Heap):对内存一般比较大,但是速度慢。一般放对象

静态存储区

静态存储区(Stastic):这个区域也可以叫做常量池。存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收

数据区

数据区(Data):这个区域专门加载代码字节数据,方法数据、函数等.高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换.


变量在内存中的存储

可变数据和不可变数据

可变数据:列表(list)、字典(dict)

不可变数据:整型(int)、浮点型(float)、字符串型(String)、元组(tuple)

为什么要区别可变和不可变?

这里的可变和不可变指的是内存中的那块内容是否可变,当数据是可变的时候,对数据进行操作时并不需要重新申请新的内存空间,只需要在此数据空间后连续申请即可。而当数据是不可变时,对数据进行一些操作的时候是需要重新在内存中申请一段新的空间,来存放新的数据。


实例

看几个实例来更深入的认识内存分配:

例子1

a = "Hello"
b = 3
c = ["Hello", 3]
print(id(a), id(b)) # 140415037732720 93831947674432
print(id(c[0]), id(c[1])) # 140415037732720 93831947674432

内存图:

因为Hello和3都是常量,所以打印出来的内存地址是相同的

例子2

class Person:
def __init__(self):
self.name = "二狗子"
self.age = 20
self.relatives = ["舅舅", "姑姑", "大爷"]
p = Person()
print(id(p.name), id(p.age)) # 140415037701936 93831947674976
p.name = "狗蛋"
p.age = 18
print(id(p.name), id(p.age)) # 140415037701840 93831947674912

内存图:

因为name是String字符串,age也是年龄都是常量,所以都是在静态存储区,并且当改变时是另开辟空间来存储新的数据。但是原来的数据并没有改变,所以打印出来的内存地址是不同的。


代码验证

来一个更有思考性的例子:

# 不可变数据
a = "Hello"
print('a的内存地址为:', id(a))
a = "World"
print('改变后a的内存地址为:', id(a))
# 可变数据
l = [12, 13, 15, 18, 20, "hello", ["world", "python"]]
b = 12
print(b, "的内存地址为:" ,id(b), id(l[0]))
b = "hello"
print(b, "的内存地址为:" ,id(b), id(l[0]))
b = ["world", "python"]
print(b, "的内存地址为:" ,id(b), id(l[0]))
print('b的内存地址为:', id(l))
l.append(4)
print('改变后b的内存地址为:', id(l))

id() 函数返回对象的唯一标识符,标识符是一个整数。

结果为:

由此可知,列表当中存储的也是各个元素的内存地址,而这些最终也会指向静态区。

Python内存浅析的更多相关文章

  1. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  2. python内存管理机制

    主要分为三部分: (1)内存池机制(2)引用计数(3)垃圾回收 (1)内存池机制对于python来说,对象的类型和内存都是在运行时确定的,所以python对象都是动态类型简单来说,python内存分为 ...

  3. 解读Python内存管理机制

    转自:http://developer.51cto.com/art/201007/213585.htm 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Pytho ...

  4. 转发:[Python]内存管理

    本文为转发,原地址为:http://chenrudan.github.io/blog/2016/04/23/pythonmemorycontrol.html 本文主要为了解释清楚python的内存管理 ...

  5. python 内存泄露的诊断 - 独立思考 - ITeye技术网站

    python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net  对于一个用 python ...

  6. Python内存优化

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  7. 使用gc、objgraph干掉python内存泄露与循环引用!

    Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...

  8. python 内存NoSQL数据库

    python 内存NoSQL数据库 来自于网络,经过修改,秉承Open Source精神,回馈网络! #!/usr/bin/python #-*- coding: UTF-8 -*- # # memd ...

  9. [转] 使用gc && objgraph 优化python内存

    转自https://www.cnblogs.com/xybaby/p/7491656.html 使用gc.objgraph干掉python内存泄露与循环引用!   目录 一分钟版本 python内存管 ...

随机推荐

  1. 死磕以太坊源码分析之downloader同步

    死磕以太坊源码分析之downloader同步 需要配合注释代码看:https://github.com/blockchainGuide/ 这篇文章篇幅较长,能看下去的是条汉子,建议收藏 希望读者在阅读 ...

  2. ext4和xfs文件系统的扩容和收缩

    1. LVM逻辑卷管理 2. ext4文件系统 2.1 扩容CentOS6的根文件系统(ext4) 根文件系统在 /dev/VolGroup/lv_root 逻辑卷上,文件系统类型为ext4,大小为1 ...

  3. 解决[BScroll warn]: Can not resolve the wrapper DOM. Vue better-scroll

    在开发项目过程中,使用better-scroll插件中遇到了滚动一次重复提示相同错误 [BScroll warn]: Can not resolve the wrapper DOM. Vue bett ...

  4. Vue2+Koa2+Typescript前后端框架教程--04班级管理示例(路由调用控制器)

    上篇文章分享了简单的三层模式和基础文件夹的创建,本篇将以示例的形式详细具体的展示Router.Controller.Service.Model之间业务处理和数据传输. 1. 班级管理数据模型创建.数据 ...

  5. SQLServer多事务——事务嵌套

    在ERP中,偶尔会有存储过程里面继续调用存储过程的情况 其中更有一些特殊的存储过程分别都使用了存储过程,大致可以分为下面几种情况: 1.平行事务,在多个事务中,任意一个成功则提交数据库,失败则各自RO ...

  6. 机器学习 第4篇:数据预处理(sklearn 插补缺失值)

    由于各种原因,现实世界中的许多数据集都包含缺失值,通常把缺失值编码为空白,NaN或其他占位符.但是,此类数据集与scikit-learn估计器不兼容,这是因为scikit-learn的估计器假定数组中 ...

  7. 基于docker,consul,consul-template, registrator, nginx服务注册发现集群

      介绍 该工程主要实现服务的自动注册发现,从而达到提高运维效率,做到服务的自动发现和动态扩展. 服务注册发现 服务启动后自动被发现 动态变更负载均衡 自动伸缩 工具 1.Registrator 这是 ...

  8. %@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%报错

    用eclipse写jsp代码时发现下面两行代码报错:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=&qu ...

  9. python +pycharm+selenium 环境搭建

    一:首先安装python:   https://www.python.org/downloads/: 下载完后一步步的点击安装,验证是否安装成功:打开win+r 打开cmd命令,输入python -V ...

  10. slice,splice,split,unshift的用法

    工作了很久始终对这4个用法处于混淆状态,今天写个帖子来警示下自己 // slice(start,end),从start值开始截取到end前的元素组成新的数组,不改变原数组 // slice(index ...