《python源代码分析》笔记 pythonVM一般表达式
本文senlie原版的。转载请保留此地址:http://blog.csdn.net/zhengsenlie
1.字节码指令
LOAD_CONST:从consts表中读取序号为i的元素并压入到执行时栈中
STORE_NAME:改变local名字空间。从符号表names取序号为i的元素作为变量名,
取执行时栈的栈顶元素作为变量值。完毕从变量名到变量值的映射关系的创建。
BUILD_MAP:创建一个空的PyDictObject对象,并压入执行时栈
DUP_TOP:将栈顶元素的引用计数添加1。并将它再次压入栈中
ROT_TWO:将栈顶的两个元素进行对调
LOAD_NAME:符号搜索,并将该元素压入执行时栈
Python在运行完一段Code Block后, 一定要返回一些值,所以在Code Block相应的字节码
后都有LOAD_CONST,RETURN_VALUE两个指令。
2.简单内建对象的创建
字节码指令对符号或常量的操作终于都将反映到执行时栈和local名字空间
co_consts 常量表, co_names 符号表
i = 1
#LOAD_CONST 0
#STORE_NAME 0
s = "Python"
#LOAD_CONST 1
#STORE_NAME 1
d = {}
#BUILD_MAP 0
#STORE_NAME 2
l = []
#BUILD_LIST 0
#STORE_NAME 3
#LOAD_CONST 2
#RETURN_VALUE none
3.复杂内建对象的创建
#以(LOAD_CONST,ROT_TWO,LOAD_CONST,STORE_SUBSCR)4字节码为一组,反复不断地将元素插入到PyDictObject对象中去。
d = {"1":1, "2":2}
# BUILD_MAP 0
# DUP_TOP
# LOAD_CONST 2 (1)
# LOAD_CONST 0 (1)
# ROT_THREE
# STORE_SUBSCR
# DUP_TOP
# LOAD_CONST 3 (2)
# LOAD_CONST 4 (2)
# ROT_THREE
# STORE_SUBSCR
# STORE_NAME 2 (d)l = [1, 2]
# LOAD_CONST 0 (1)
# LOAD_CONST 4 (2)
# BUILD_LIST 2
# STORE_NAME 3 (1)
4.其它一般表达式
符号搜索
b = a
#LOAD_NAME 0 (a)
#STORE_NAME 1 (b)
//LOAD_NAME LGB规则
//获得变量名
w = GETITEM(names, oparg);
//[1]:在local名字空间中查找变量名相应的变量值
v = f->f_locals;
x = PyDict_GetItem(v, w)
Py_XINCREF(x);
if (x == NULL) {//[2]:在global名字空间中查找变量名相应的变量值x = PyDict_GetItem(f->f_globals, w);if (x == NULL) {//[3]:在builtin名字空间中查找变量名相应的变量值x = PyDict_GetItem(f->f_builtins, w);if (x == NULL) {//[4]:查找变量名失败。抛出异常format_exc_check_arg(PyExc_NameError,NAME_ERROR_MSG, w);break;}}Py_INCREF(x);
}
PUSH(x);
数值运算
Python为PyIntObject对象和 PyStringObject对象准备了高速通道。
假设
你的程序中涉及了大量的浮点运算,能够改动 BINARY_ADD中的代码,为浮点
运算建立高速通道。
c = a + b
# LOAD_NAME 0 (a)
# LOAD_NAME 1 (b)
# BINARY_ADD
# STORE_NAME 2 (c)
//BINARY_ADDw = POP();v = TOP();if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {//[1]:PyIntObject对象相加的高速通道register long a, b, i;a = PyInt_AS_LONG(v);b = PyInt_AS_LONG(w);//[2]:假设加法运算溢出,转向慢速通道i = (long)((unsigned long)a + b);if ((i^a) < 0 && (i^b) < 0)goto slow_add;x = PyInt_FromLong(i);}//[3]:PyStringObjecgt对象相加的高速通道else if (PyString_CheckExact(v) &&PyString_CheckExact(w)) {x = string_concatenate(v, w, f, next_instr);/* string_concatenate consumed the ref to v */goto skip_decref_vx;}//[4]:一般对象相加的慢速通道else {
slow_add:x = PyNumber_Add(v, w);}Py_DECREF(v);
skip_decref_vx:Py_DECREF(w);SET_TOP(x);break;
信息输出
print c
# LOAD_NAME 2 (c)
# PRINT_ITEM
# PRINT_NEWLINE
版权声明:本文博客原创文章。博客,未经同意,不得转载。
转载于:https://www.cnblogs.com/mfrbuaa/p/4603661.html
《python源代码分析》笔记 pythonVM一般表达式相关推荐
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- Python文本分析---笔记
Python文本分析 格式化数据:表格.json 非格式化数据:字符串.文本 内容: 1.中文分词 2.自定义词典.去停用词 3.词频统计.关键词抽取 4.案例:招聘需求关键词抽取 一. 中文分词 分 ...
- Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭
这里所说的错误有两种: 1.http协议规定的错误,如404错误. 2.server执行过程中的错误.如write错误. 对于http协议规定的错误,这里的"错误"是针对clien ...
- 热血传奇Rungate源代码分析笔记
RunGate有三个Socket对象 一个向M2发送 一个接收客户端的连接.还有一个连接控制台(当然这个是和控制台绑定的通常手动启动是不需要的 只是在私服这方面方便私服架设 者使用) 控 ...
- 传世基本架构-Rungate源代码分析笔记。
RunGate有三个Socket对象 一个向M2发送 一个接收客户端的连接.还有一个连接控制台(当然这个是和控制台绑定的通常手动启动是不需要的 只是在私服这方面方便私服架设 者使用) 控 ...
- python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析
#2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR python数据挖掘学习笔记]十九.鸢尾花数据集可视化.线性回 ...
- python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据
但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...
- python数据挖掘学习笔记】十三.WordCloud词云配置过程及词频分析
#2018-03-28 09:59:40 March Wednesday the 13 week, the 087 day SZ SSMR 11,12因为涉及到数据库被我暂时放弃了 python数据挖 ...
- Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据
#2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...
- Python数据分析入门笔记10——简单案例练习(学生信息分析)
系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...
最新文章
- ECLIPSE在线安装SVN
- 聚类分析在用户行为中的实例_聚类分析在用户分类中的应用
- 微软应用商店_微软自家的软件也放弃Windows 10
- SQL Server2008导入导出数据库
- qt绘制一圈圆_Qt绘制圆形,矩形等图形 绘制同心圆
- c++中友元函数详解
- 深入理解InnoDB(1)—行的存储结构
- 2018 C语言大作业--21_Ekko制作教程
- nginx获取代理服务ip及客户端真实ip
- Centos7下载安装教程【图文详解】
- cso(布谷鸟)算法优化神经网络参数
- 好视通视频会议平台系统漏洞复现
- debug5x 微信_微信X5内核webview调试
- canvas实现图片旋转
- 王者荣耀的技术修炼之路
- 亿起发网站主获取CPS数据接口说明
- 嵌入式系统开发这六点硬件设计需要细心留意
- Appy Couple:婚礼策划应用 用户个性化定制
- (android)Apache Cordova
- 中本聪在2009年挖到了100万枚BTC?
热门文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
- Oracle Share Pool工作原理
- 云主机前景几何,风萧萧兮!
- [实验手册]用2500路由器做自动安装实验
- 执行查看linux端口命令 9083 端口发现被占用 Hive安装过程遇到的问题
- java.lang.InternalError: internal error: SHA-1 not available.
- 运维专家写给运维工程师的 6 条人生忠告
- C++ 牛客网普及组第二次测试B
- 反向传播与梯度消失梯度爆炸
- Java 爬虫简单起步