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 ...
随机推荐
- C++中std::fill/std::fill_n的使用
There is a critical difference between std::fill and memset that is very important to understand. st ...
- cakephp1.3中help form的一个小问题
如果我们在模版里这么干 <?php echo $form->input('last_sold_date',array('autocomplete'=>'off','label'=&g ...
- 海思NB-IOT的SDK看门狗的使用
1. 看门狗需要喂狗,如果自己写的任务一直运行,那么空闲任务无法运行会导致看门狗复位,来看下看门狗的机制,首先系统启动的时候创建了空闲任务 在这个函数里面void vTaskStartSchedule ...
- Bing wallpaper api
list: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-cn idx:-1为明天,1为 ...
- FastJson - 从HttpEntity到Json
在使用java + httpClient施行API自动化时,不可避免地遇到了如下问题: 1. 用Http Response数据做断言: 2. 用上一个请求的Response内容,作为下一个请求的参数: ...
- 【转】: 探索Lua5.2内部实现:虚拟机指令(1) 概述
Lua一直把虚拟机执行代码的效率作为一个非常重要的设计目标.而采用什么样的指令系统的对于虚拟机的执行效率来说至关重要. Stack based vs Register based VM 根据指令获取操 ...
- CodeForces 838B Diverging Directions 兼【20180808模拟测试】t3
描述 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点到达. 2. 接下来的 N-1 ...
- 讯飞云 API 语音听写 python3 调用例程
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...
- 使用清华镜像在python中pip 安装
Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程 配置镜像 在conda安装好之后,默认的镜像是官方的,由于官网的镜像在境外,我们使用国内 ...
- py3.6+anaconda下安装opencv3
py3.6+anaconda下安装opencv3 首先声明-网上的方法大多数都是有毒的.也不知道给的什么鬼方法都不行. 我说下我的方法.去这个网站https://pypi.tuna.tsinghua. ...