Python 源码剖析(一)【python对象】
处于研究python内存释放问题,在阅读部分python源码,顺便记录下所得。
(基于《python源码剖析》(v2.4.1)与 python源码(v2.7.6))
先列下总结:
python 中一切皆为对象,所以会先讲明白python中的对象,然后开始整理最简单的两个类型,整形和字符串;然后会进一步探索容器类型,会讲 List 和 Dict,以及内存管理机制。有时间精力会总结下《python源码剖析》作者的 python模拟程序、编译的code对象与pyc文件、python虚拟机相关知识,运行环境,模块动态加载、多线程机制。
直入主题,开始总结。
一、Python对象
1、对象
2、对象类型
3、继承与多态
4、引用计数
5、对象分类
1、对象
python中一切皆为对象,包括自定义类型,int、str、list、dict等都是对象,先看看所有对象的基石:
*定长对象(int,str):
[object.h]
typedef struct_object{
PyObject_HEAD
}PyObject;
*变长对象(list,dict..):
[object.h]
typedef struct{
PyObject_VAR_HEAD
}PyVarObject;
//前者依赖于PyObject_HEAD,后者依赖于PyObject_VAR_HEAD,看看两者不同:
图1-1-1
由图1-1-1可见,定长对象中有
ob_refcnt、ob_type这两个变量,变长对象中多了一个ob_size变量;其中,ob_refcnt用于引用计数机制,ob_type是一个指向_typeobject结构体的指针,ob_size指变长对象中包含的元素个数。
ob_refcnt后面内存回收时再讲,大概就是某个对象A,对其有引用时引用计数增加,释放时引用计数减少,引用计数为0时将回收对象A,从堆上删除释放内存。
ob_type中_typeobject结构体,用于指定一个对象类型的类型对象。有点拗口,下节讲。
ob_size用于指明容器对象中拥有元素的个数,不是字节数。
2、对象类型
现在分析上节提到的_typeobject,类型对象。
![]()
图1-2-1
_typeobject是比较大的一个结构体,主要有四类信息:
1、类型名tp_name,用于pyhton内部及调试;
2、创建该类型对象时分配内存空间大小信息,tp_basicsize和tp_itemsize;
3、与该对象有关的操作信息,如hashfunc(函数指针),操作主要分为标准操作、标准操作族、其他操作;
4、类型信息;
_typeobject头部中有PyObject_VAR_HEAD,说明类型也是一个对象,而类型对象的类型则是PyType_Type(图1-2-2):
图1-2-2
例如整形int(图1-2-3):
图1-2-3
其运行时对象类型关系(图1-2-4):
图1-2-4
3、继承与多态
通过前面的PyObject和类型对象,Python利用C语言实现继承和多态。首先,Python中所有内建对象和内部使用对象在最开始内存区域都有一个PyObject,相当于这些对象都继承于PyObject;在建立一个对象时,如PyIntObject,这对象由PyObject*维护而非PyIntObject*维护,而这指针指向的类型只能从ob_type域判断,从而实现多态。
4、引用计数
Python内建了垃圾收集机制,使用每个对象共有的ob_refcnt来维护引用计数,通过PyINCREF(op)和Py_DECREF(op)两个宏来增减对象引用计数,当引用计数为0后通过tp_dealloc释放其内存和系统资源。在对象初始化时,通过_Py_NewReference(op)将对象引用计数初始化为1。(代码如图1-4-1)
图1-4-1
还有要注意的是,但引用计数减为0时,会调用该对象的析构函数,但不一定会调用free,频繁申请、释放内存降会低执行效率,Python使用内存池计数作为补充。
5、对象分类
1、Math:数值对象
2、Container:容器对象
3、Composition:程序结构对象
4、Internal:内部使用对象
图示(图1-5-1):
图1-5-1
Python 源码剖析(一)【python对象】的更多相关文章
- [Python源码剖析]获取Python小整数集合范围
#!/usr/bin/env python #-*- coding=utf-8 -*- small_ints = dict() for i in range(-10000,10000): small_ ...
- 《Python 源码剖析》之对象
py一切皆对象的实现 Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObject, 两个定义都 ...
- Python源码剖析|百度网盘免费下载|Python新手入门|Python新手学习资料
百度网盘免费下载:Python源码剖析|新手免费领取下载 提取码:g78z 目录 · · · · · · 第0章 Python源码剖析——编译Python0.1 Python总体架构0.2 Pyth ...
- Python开发【源码剖析】 List对象
前言 本文探讨的Python版本为2.7.16,可从官网上下载,把压缩包Python-2.7.16.tgz解压到本地即可 需要基本C语言的知识(要看的懂) PyListObject对象 PyListO ...
- Python源码剖析——01内建对象
<Python源码剖析>笔记 第一章:对象初识 对象是Python中的核心概念,面向对象中的"类"和"对象"在Python中的概念都为对象,具体分为 ...
- python源码剖析学习记录-01
学习<Python源码剖析-深度探索动态语言核心技术>教程 Python总体架构,运行流程 File Group: 1.Core Modules 内部模块,例如:imp ...
- Python源码剖析——02虚拟机
<Python源码剖析>笔记 第七章:编译结果 1.大概过程 运行一个Python程序会经历以下几个步骤: 由解释器对源文件(.py)进行编译,得到字节码(.pyc文件) 然后由虚拟机按照 ...
- Python 源码剖析 目录
Python 源码剖析 作者: 陈儒 阅读者:春生 版本:python2.5 版本 本博客园的博客记录我会适当改成Python3版本 阅读 Python 源码剖析 对读者知识储备 1.C语言基础知识, ...
- socket_server源码剖析、python作用域、IO多路复用
本节内容: 课前准备知识: 函数嵌套函数的使用方法: 我们在使用函数嵌套函数的时候,是学习装饰器的时候,出现过,由一个函数返回值是一个函数体情况. 我们在使用函数嵌套函数的时候,最好也这么写. def ...
随机推荐
- BZOJ4247_挂饰_KEY
题目传送门 背包的变形,不得不说卡了我很久(估计是下午睡傻了). 设f[i][j]为前i个物品剩下j个挂钩. f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i].x,0)+ ...
- 成都Uber优步司机奖励政策(4月6日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- python 3.6 setup
1.添加python3.6安装包,并且安装 sudo apt-get install software-properties-common 2.下载python3.6 sudo add-apt-rep ...
- 网易云易盾与A10 Networks达成战略合作 携手打造抗DDoS攻击的解决方案
欢迎访问网易云社区,了解更多网易技术产品运营经验. 2018年9月,网易云易盾宣布,与智能和自动化网络安全解决方案提供商A10 Networks结成战略合作伙伴关系.双方将在抗DDoS攻击领域展开深入 ...
- WSL跑linux服务程序
前段时间折腾了一次WSL下的Apache,无奈遇到各种奇葩问题,总是解决不了,最终放弃,甚至得出了一个现在看来比较可笑的结论:WSL是不可能跑Linux服务程序的! 当时的思路想歪了,由于Apache ...
- NNLearning阶段性总结01
神经网络最基本的元素与计算流程: 基本的组网原则: 神经网络监督学习的基本步骤: 初始化权值系数 提取一个样本输入NN,比较网络输出与正确输出的误差 调整权值系数,以减少上面误差——调整的方法对应不同 ...
- 使用httpClient获取请求cookie
package mytest; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValueP ...
- Unity编辑器 - Rigidbody动力学Bake到AnimationClip
Unity编辑器 - Rigidbody动力学Bake到AnimationClip Unity文档移动平台优化部分提到Physics对CPU的消耗较大 将动力学的特效如破碎等Bake成动画也是优化性能 ...
- C++11 type_traits 之is_pointer,is_member_function_pointer源码分析
源码如下: template<typename> struct __is_pointer_helper : public false_type { }; template<typen ...
- Request对象及常用方法
Object getAttribute(String name) 获得name的属性,若不存在,则返回null Enumeration getAttributeNames() 返回一个枚举类型的包含r ...