20191031:Python底层机制
20191031:Python底层机制
python底层从3个方面来说,分别是:
- 引用计数机制
- 垃圾回收机制
- 内存池机制
引用计数机制
使用引用计数来追踪内存中的对象,所有对象都有引用计数,并且这个引用计数一般比我们想象的次数多,对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存,可以通过sys.getrefcount( )来查看对象应用次数。如下:
>>> a =19880924 >>> sys.getrefcount(19880924) 3 >>> b =19880924 >>> sys.getrefcount(19880924) 3 >>> c = 19880924 >>> sys.getrefcount(19880924) |
可以看到19880924的引用次数没有随着对象的声明而增加。
>>> c = 19880924 >>> sys.getrefcount(19880924) 3 >>> sys.getrefcount(c) 2 >>> d = c >>> sys.getrefcount(c) 3 >>> e = c >>> sys.getrefcount(c) 4 |
但是如果是对象的引用,则对象的引用次数增加
内存存储机制类似如下:
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
垃圾回收机制
- 当一个对象的引用计数为0的时候就被垃圾回收给回收掉了
- 解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
a) 假如2个对象相互引用,由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。针对这种情况适用于2
内存池机制
Pymalloc机制:引入内存池机制,是用于管理小块内存的申请和释放的,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
python回收的内存放到内存池而不是返回给操作系统。
20191031:Python底层机制的更多相关文章
- tensorflow入门教程和底层机制简单解说——本质就是图计算,自动寻找依赖,想想spark机制就明白了
简介 本章的目的是让你了解和运行 TensorFlow! 在开始之前, 让我们先看一段使用 Python API 撰写的 TensorFlow 示例代码, 让你对将要学习的内容有初步的印象. 这段很短 ...
- Python内部机制-PyObject对象
PyObject对象机制的基石 学过Python的人应该非常清晰,Python中一切都是对象,全部的对象都有一个共同的基类,对于本篇博文来说,一切皆是对象则是探索Python的对象机制的一个入口点.我 ...
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- 【Python&数据结构】 抽象数据类型 Python类机制和异常
这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...
- Python反射机制理解
Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...
- [转]STL 容器一些底层机制
1.vector 容器 vector 的数据安排以及操作方式,与 array 非常相似.两者的唯一区别在于空间的运用的灵活性.array 是静态空间,一旦配置了就不能改变,vector 是动态数组.在 ...
- 理解Python命名机制
理解Python命名机制 本文最初发表于恋花蝶的博客(http://blog.csdn.net/lanphaday),欢迎转载,但必须保留此声明且不得用于商业目的.谢谢. 引子 我热情地邀请大家猜测下 ...
- C++ STL容器底层机制
1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入 ...
- 探索C++的底层机制
探索C++的底层机制 在看这篇文章之前,请你先要明白一点:那就是c++为我们所提供的各种存取控制仅仅是在编译阶段给我们的限制,也就是说是编译器确保了你在完成任务之前的正确行为,如果你的行为不正确,那么 ...
随机推荐
- 范仁义web前端介绍课程---5、webstorm的下载安装
范仁义web前端介绍课程---5.webstorm的下载安装 一.总结 一句话总结: webstorm破解版搜索:webstorm破解 site:52pojie.cn 编辑器随便选用,功能都差不多,哪 ...
- 开启和关闭oracle数据库中的审计功能
第1步:查看审计功能是否开启?SQL> show parameter audit;NAME TYPE VALUE-- ...
- arcpy 重分类
arcpy.gp.Reclassify_sa("dem.tif","Value","0 2000 1;2000 2100 2;2100 2500 3; ...
- env (arcpy)
addOutputsToMap (读写) 设置是否应将工具产生的输出数据集添加至应用程序显示. Boolean autoCommit (读写) 支持“自动提交”环境的工具将在 ArcSDE 事务中进行 ...
- [设计原则与模式] Java 适配器模式
cp from : https://blog.csdn.net/xiaouncle/article/details/80553923 设计模式本质上就是“SOLID设计原则”在实际应用中的具体体现,我 ...
- 【转】iPhone手机获取uuid 安装测试app
iPhone手机获取uuid 安装测试app UDID是一种iOS设备的特殊识别码.除序号之外,每台ios装置都另有一组独一无二的号码,我们就称之为识别码( Unique Device Identif ...
- Spring IOC的缓存
1.将上一篇的测试代码修改如下 public class SpringTest { public static void main(String[] args) { ClassPathResource ...
- Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装
Android App 升级执行流程 1.获取本地版本号 2.请求服务器获取服务器版本号 3.本地版本和服务器版本不一致提示升级,弹窗提示用户是否更新 4.用户确定升级,调用文件传输方法下载 apk ...
- Python不带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 不带参数的类装饰器 # 类装饰器的实现,必须实现__call__和__init__两个内置函数. # __init ...
- ISO/IEC 9899:2011 条款6.7.1——存储类说明符
6.7.1 存储类说明符 语法 1.storage-class-specifier: typedef extern static _Thread_local auto register 约束 2.在一 ...