第一课、内存管理机制

一、课程介绍

  1.1 课程概要

  课程概要

  • 赋值语句的内存分析
  • 垃圾回收机制
  • 内存管理机制

  课程目标

  • 掌握赋值语句内存分析方法
  • 掌握id()和is()的使用
  • 了解python的垃圾回收机制
  • 了解python的内存管理机制

  1.2 为什么要学习内存管理

  内存管理的重要性

  • 跳槽+面试
  • 决定薪资高度
  • 代码更高效、程序更健壮
  • 以更快、更好的方式解决问题
  • 只有8G内存如何高效的分析上G的数据
  • 只有8G内存,为什么程序可以一直跑下去
  • 8G内存的背后,python都做了些什么
  • 了解到python语言的强大,设计的巧妙
  • 更深入的理解python这门语言

二、 Python的内存管理机制(重难点内容,多回听视频)

  2.1 赋值语句内存分析

  赋值语句内存分析

  • 使用id()方法访问内存地址
 1 def extend_list(val, l=[]):
2 l.append(val)
3 return l
4
5 list1 = extend_list(10, [])
6 list2 = extend_list(123)
7 list3 = extend_list('a')
8
9 print(list1, id(list1))
10 print(list2, id(list2))
11 print(list3, id(list3))

  2.2 垃圾回收机制

  垃圾回收机制

  • 以引用计数为主,分代收集为辅
  • 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
  • 引用计数的缺陷是循环引用的问题
 1 class Cat(object):
2 def __init__(self):
3 print('对象产生了:{0}'.format(id(self)))
4 def __del__(self):
5 print('对象删除了:{0}'.format(id(self)))
6
7 def f0():
8 """自动回收内存"""
9 while True:
10 c1 = Cat()
11
12 def f1():
13 """一直在被引用,不会被回收"""
14 l = []
15 while True:
16 c1 = Cat()
17 l.append(c1)
18 print(len(l))
19
20 if __name__ == '__main__':
21 f0()
22 f1()

  2.3 内存管理机制

  引用计数

  • 每个对象都有存有指向该对象的引用总数
  • 查看某个对象的引用计数

    sys.getrefcount()

  • 可以使用del关键字删除某个引用
 1 import sys
2
3 i = 1
4
5 l = []
6 l2 = l
7 l3 = l
8 l5 = l3
9
10 print(sys.getrefcount(l))
11
12 del l2
13
14 # 对象l被引用的数量
15 print(sys.getrefcount(l))
16
17 print('xxxxxxxxxxxxxx')
18 print(sys.getrefcount(i))
19 a = i
20 print(sys.getrefcount(i))

  垃圾回收

  • 满足特定条件,自动启动垃圾回收
  • 当python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
  • 当两者的差值高于某个阈值时,垃圾回收才会启动
  • 查看阈值gc.get_threshold()

  分代回收

  • python将所有的对象分为0,1,2三代
  • 所有的新建对象都是0代对象
  • 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象

  手动回收

  • gc.collect()手动回收
  • objgraph模块中的count()记录当前类产生的实例对象的个数
 1 import gc, sys
2 import objgraph
3 print(gc.get_threshold())
4
5
6 class Persion(object):
7 pass
8
9
10 class Cat(object):
11 pass
12
13 p = Persion()
14 c = Cat()
15 p.name = 'Susan'
16 p.pet = c
17
18 c.master = p
19
20 print(sys.getrefcount(p))
21 print(sys.getrefcount(c))
22
23 # del p
24 # del c
25
26 # 手动执行垃圾回收
27 gc.collect()
28 print(objgraph.count('Persion'))
29 print(objgraph.count('Cat'))

  内存管理机制

  • 内存池(memory pool)机制
  • python3中的内存管理机制--Pymalloc
  • 单位换算

三、 课程总结

  课程总结

  课程总结

  • 赋值语句内存分析
  • 垃圾回收机制
  • 内存管理机制

  知识点回顾

  赋值语句内存分析

  • 使用id()方法访问内存地址
  • 使用is比较内存引用地址是否相等

  垃圾回收机制

  • 以引用计数为主
  • 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
  • 引用计数的缺陷是循环引用的问题

  引用计数(reference count)

  • 每个对象都有存有指向该对象的引用总数
  • 查看某个对象的引用计数
  • 可以使用del关键字删除某个引用

  垃圾回收

  • 满足特定条件,自动启动垃圾回收
  • 当python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
  • 当两者的差值高于某个阈值时,垃圾回收才会启动
  • 查看阈值gc.get_threshold()

  分代回收

  • python将所有的对象分为0,1,2三代
  • 所有的新建对象都是0代对象
  • 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象

  手动回收

  • gc.collect()手动回收
  • objgraph模块中的count()记录当前类产生的实例对象的个数

  内存管理机制

  • 内存池(memory pool)机制
  • python3中的内存管理机制--Pymalloc
  • 单位换算

【python】第一模块 步骤五 第一课、内存管理机制的更多相关文章

  1. Python 源码剖析(六)【内存管理机制】

    六.内存管理机制 1.内存管理架构 2.小块空间的内存池 3.循环引用的垃圾收集 4.python中的垃圾收集 1.内存管理架构 Python内存管理机制有两套实现,由编译符号PYMALLOC_DEB ...

  2. Python内存管理机制-《源码解析》

    Python内存管理机制 Python 内存管理分层架构 /* An object allocator for Python. Here is an introduction to the layer ...

  3. python的内存管理机制

    先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量 ...

  4. Python内存管理机制及优化简析(转载)

    from:http://kkpattern.github.io/2015/06/20/python-memory-optimization-zh.html 准备工作 为了方便解释Python的内存管理 ...

  5. python的内存管理机制(zz)

    本文转载自:http://www.cnblogs.com/CBDoctor/p/3781078.html 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计 ...

  6. 【python测试开发栈】—python内存管理机制(二)—垃圾回收

    在上一篇文章中(python 内存管理机制-引用计数)中,我们介绍了python内存管理机制中的引用计数,python正是通过它来有效的管理内存.今天来介绍python的垃圾回收,其主要策略是引用计数 ...

  7. Python深入之python内存管理机制(重点)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:醍醐三叶   关于python的存储问题, (1)由于python中 ...

  8. (重点)Python深入之Python内存管理机制你会吗?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:醍醐三叶 请注意:如果你平时学Python遇到问题找不到人解答?或者没有 ...

  9. 深入Python底层,谈谈内存管理机制

    说到内存管理,就先说一下垃圾回收吧.垃圾回收是Python,Java等语言管理内存的一种方式,说的直白些,就是清除无用的垃圾对象.C语言及C++中,需要通过malloc来进行内存的申请,通过free而 ...

  10. 了解Python内存管理机制,让你的程序飞起来

    引用: 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面 ...

随机推荐

  1. docker 安装 elasticsearch7.6.2 kibana7.6.2

    [root@abcdefg bin]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6896f6e3202c ...

  2. [Nginx]status:203 Failed to start The NGINX HTTP and reverse proxy server

    怎么感觉Linux的nGinx比Win的事一个一个一个的多啊(半恼) 运行systemctl status nginx时提示: ① Process: 123456 ExecStartPre=/usr/ ...

  3. 记录POI导入时单元格下拉框两种实现方式(excel数据有效性)

    如果下拉选项字符少于225 使用方式1 public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, in ...

  4. Springboot开发微信支付API-V3

    前段时间因为项目需要对接微信支付,原本打算拿之前开发好的代码用就行了,后面发现微信支付升级API-V3了,和V2相比安全措施多了很多.最麻烦的就是各种证书的管理.加载. 作者自己也对接过N多支付系统了 ...

  5. Vue 数组响应

    响应渲染 在Vue中,被渲染的数据都是响应式的,即Vue实例中进行改变页面中也会跟着改变: <body> <div id="app"> <p>{ ...

  6. UI动画 - CATransaction

    前言 1 - CAAnimation 并不是一个单纯的实现动画的框架,它原本叫 Layer Kit.管理着树状结构的图层数据,并快速组合这些图层,最终构成了一切可视化的基础 2 - 在构建可视化,也就 ...

  7. centos7的密码安全策略加固

    centos7操作系统 在CentOS 7上实现密码复杂度策略设置 一.使用login.defs文件 解析:/etc/login.defs 是设置新建用户帐号限制的文件.该文件里的配置对root用户无 ...

  8. (转载)史上最详细的docker学习手册

    原文链接:https://my.oschina.net/u/1388595/blog/5078146 一.docker入门 1.docker的安装及入门示例 环境准备:docker需要安装在cento ...

  9. cublas fp16

    编译选项: nvcc 4.cpp -o test_gemm  -lcudart -lcuda -lcublas -std=c++11 #include <sys/time.h> #incl ...

  10. div+css CSS基本

        • css 高度(height) • css 宽度(width)   · • css 边框(border)   · • css 背景(background)   · • css 浮动(floa ...