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 ...
随机推荐
- 成都Uber优步司机奖励政策(4月5日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(3月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 宁波Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 设置cell高度的两种方法(label高度的可变引起cell高度可变的情况)
第一种:(iOS8以后可用) 在Xib或stroyboard中(代码也可以) 利用AutoLayout设置好label的约束(比如可以设置四个边都距离屏幕50等方式,必须四个边都要固定好). 在代码部 ...
- springboot整合kafka应用
1.kafka在消息传递的使用非常普遍,相对于activemq来说kafka的分布式管理和使用更加灵活. 2.activemq的搭建和使用可以参考: activemq搭建和springmvc的整合:h ...
- ajax跨域请求php
在众多站群中,不同功能的系统使用独立的一个域名,各系统之间存在相互调用的关系.使用js的XMLHttpRequest调用其他域名提示跨域权限不足.有些可能认为都同属于同一个顶级域名或者说域名一模一样怎 ...
- JSP学习(JavaBean)
Java Web学习 一.搭建java web开发环境: (1)安装jdk (2)安装Tomcat服务器(Apache的开源项目),安装Tomcat并设置环境变量 (3)安装EclipseEE(或者M ...
- 【WXS全局对象】Date
属性: 名称 说明 Date.parse( [dateString] ) 解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数. Date.UTC(year,month,day ...
- 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中
一.两个脚本代码 Dockerfile FROM bash COPY . /usr/herui/ WORKDIR /usr/herui/ CMD [ "sh", "hel ...
- 吴恩达j机器学习之过拟合
五.编程作业: 见:https://www.cnblogs.com/tommyngx/p/9933803.html