本文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一般表达式相关推荐

  1. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  2. Python文本分析---笔记

    Python文本分析 格式化数据:表格.json 非格式化数据:字符串.文本 内容: 1.中文分词 2.自定义词典.去停用词 3.词频统计.关键词抽取 4.案例:招聘需求关键词抽取 一. 中文分词 分 ...

  3. Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭

    这里所说的错误有两种: 1.http协议规定的错误,如404错误. 2.server执行过程中的错误.如write错误. 对于http协议规定的错误,这里的"错误"是针对clien ...

  4. 热血传奇Rungate源代码分析笔记

    RunGate有三个Socket对象  一个向M2发送  一个接收客户端的连接.还有一个连接控制台(当然这个是和控制台绑定的通常手动启动是不需要的 只是在私服这方面方便私服架设      者使用) 控 ...

  5. 传世基本架构-Rungate源代码分析笔记。

    RunGate有三个Socket对象  一个向M2发送  一个接收客户端的连接.还有一个连接控制台(当然这个是和控制台绑定的通常手动启动是不需要的 只是在私服这方面方便私服架设      者使用) 控 ...

  6. python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

    #2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR python数据挖掘学习笔记]十九.鸢尾花数据集可视化.线性回 ...

  7. python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据

    但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...

  8. python数据挖掘学习笔记】十三.WordCloud词云配置过程及词频分析

    #2018-03-28 09:59:40 March Wednesday the 13 week, the 087 day SZ SSMR 11,12因为涉及到数据库被我暂时放弃了 python数据挖 ...

  9. Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据

    #2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...

  10. Python数据分析入门笔记10——简单案例练习(学生信息分析)

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

最新文章

  1. ECLIPSE在线安装SVN
  2. 聚类分析在用户行为中的实例_聚类分析在用户分类中的应用
  3. 微软应用商店_微软自家的软件也放弃Windows 10
  4. SQL Server2008导入导出数据库
  5. qt绘制一圈圆_Qt绘制圆形,矩形等图形   绘制同心圆
  6. c++中友元函数详解
  7. 深入理解InnoDB(1)—行的存储结构
  8. 2018 C语言大作业--21_Ekko制作教程
  9. nginx获取代理服务ip及客户端真实ip
  10. Centos7下载安装教程【图文详解】
  11. cso(布谷鸟)算法优化神经网络参数
  12. 好视通视频会议平台系统漏洞复现
  13. debug5x 微信_微信X5内核webview调试
  14. canvas实现图片旋转
  15. 王者荣耀的技术修炼之路
  16. 亿起发网站主获取CPS数据接口说明
  17. 嵌入式系统开发这六点硬件设计需要细心留意
  18. Appy Couple:婚礼策划应用 用户个性化定制
  19. (android)Apache Cordova
  20. 中本聪在2009年挖到了100万枚BTC?

热门文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列
  2. Oracle Share Pool工作原理
  3. 云主机前景几何,风萧萧兮!
  4. [实验手册]用2500路由器做自动安装实验
  5. 执行查看linux端口命令 9083 端口发现被占用 Hive安装过程遇到的问题
  6. java.lang.InternalError: internal error: SHA-1 not available.
  7. 运维专家写给运维工程师的 6 条人生忠告
  8. C++ 牛客网普及组第二次测试B
  9. 反向传播与梯度消失梯度爆炸
  10. Java 爬虫简单起步