《python源代码分析》笔记 pythonVM一般表达式

2023-11-10

本文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_ADD
	w = 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

版权声明:本文博客原创文章。博客,未经同意,不得转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《python源代码分析》笔记 pythonVM一般表达式 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • 查找 with: 块中定义的函数

    这是一些代码理查德 琼斯的博客 http www mechanicalcat net richard log Python Something I m working on 3 with gui vertical text gui labe
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • 在 Python 中使用 sec 函数的反函数

    我正在创建一个程序 用于计算从一定高度范围和设定初始速度发射射弹的最佳角度 在我需要使用的最终方程中 存在一个反 sec 函数 它导致了一些麻烦 我已经导入了数学并尝试使用 asec 无论如何 但是数学似乎无法计算反秒函数 我也明白 sec
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 如何在 Windows 上使用 Python 3.6 来安装 Python 2.7

    我想问一下如何使用pip install对于 Python 2 7 当我之前安装并使用 Python 3 6 时 我现在必须使用 Windows 上的 Python 版本 pip install 继续安装 Python 3 6 我需要使用以
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • mysql处理null值_详解MySQL处理NULL值的方法提高性能

    本文主要介绍的是MySQL数据库NULL的实际用法以及其实际应用代码的描述 以下就是文章的详细内容描述 望你会有所收获 1 对含空值列进行排序 建表 mysql gt create table t1 col1 int primary key
  • 解决Openwrt安装插件提示一下错误的办法

    解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件 提示一下错误 Collected errors check data file clashes Package 17ce wants to install fil
  • GLSL std140布局规则

    标准uniform块布局 The following example illustrates the rules specified by the std140 layout layout std140 uniform Example Ba
  • vue+elementui el-switch按钮的文字居内

    效果图 代码 UI图需求是将文字放在switch里面 而elementui默认的文字是在外面 这时候就要改样式了 可根据需求更改下面代码样式
  • SpringCloud Gateway整合Spring Security Webflux的关键点(痛点解析),及示例项目

    最近公司项目需要用到后端的认证 授权 且公司项目目前是基于SpringCloud Gateway的 所以想到都是一家的产品就决定使用Spring Security了 但是在整合过程中 经历了种种磨难 所以把最终的整合关键点列出来 让需要的读
  • 写一段关于社会福利最大化模型的实时定价的matlab代码

    我抱歉地告诉您 我不能为您提供完整的 Matlab 代码 因为这需要很多细节和预处理来实现 但是 我可以向您展示一些关于社会福利最大化模型实时定价的代码片段 以下是一个示例 Matlab 代码片段 其中展示了如何使用 fmincon 函数来
  • 求最大数(c语言)

    include
  • python判断列表是否有重复数据_Python如何判断列表里是否有重复元素

    Python如何判断列表里是否有重复元素 发布时间 2020 10 28 02 54 38 来源 亿速云 阅读 122 作者 小新 小编给大家分享一下Python如何判断列表里是否有重复元素 希望大家阅读完这篇文章后大所收获 下面让我们一起
  • 2020年给应届程序员,几点求职面试的建议

    简历书写 作为一个应届毕业生 如何让我们的简历出众 可以让hr一眼相中你呢 个人觉得以下几点很重要 1 项目经历或者大赛获奖经历 亮点 这里的项目经历不是你做得demo或者你在学校做得课程设计 而是实实在在的要给客户使用的软件 我一直有一个
  • Vue项目开发介绍

    Vue项目目录介绍 node modules 内部有很多当前项目依赖的模块 public 存放页面图标和不支持 JavaScript 情况时的页面 favicon ico 网站小图标 index html spa单页面应用 src 存放 v
  • CXF提供Client调用WebService接口的方法

    1 JaxWsProxyFactoryBean 简介 调用方式采用了和RMI类似的机制 即客户端直接服务器端提供的服务接口 interface CXF通过运行时代理生成远程服务的代理对象 在客户端完成对webservice的访问 几个必填的
  • 小样本利器1.半监督一致性正则 Temporal Ensemble & Mean Teacher代码实现

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Radon变换

    转自 http baike baidu com view 2435650 htm 两维情况下radon变换大致可以这样理解 一个平面内沿不同的直线 直线与原点的距离为d 方向角为alfa 对f x y 做线积分 得到的像F d alfa 就
  • spring 事务问题:Transaction rolled back because it has been marked as rollback-only

    问题描述 同事测试时使用异常数据 代码报错但是并不是异常产生的错误 而出现 Transaction rolled back because it has been marked as rollback only 中文翻译就是 事务已回滚 因
  • JDK8 JVM 简单堆分配实验

    实验环境 JDK8 Eclipse Neon 1a Release 4 6 1 实验问题 在进行新生代的from和to空间分配的配置时 发现分配的空间大小不对 实验内容 jvm参数 Xmx20m Xms20m Xmn1m XX Surviv
  • c 语言数组基本操作(查找,修改,删除,插入)

    写在前面 自己写了一遍 不够精简 又借鉴了别人的例子 最后得出这个版本 恐怕既不是最简单的 也不是最精妙的 但是我目前能实现的比较清晰简洁的一版 还是先把 见怪不怪 给大牛写在前面 好了开始吧 第一个查找 这个没什么好说的 就按值查找并返回
  • C++解析JSON文件

    在上一篇博客我讲解了使用C 读取XML文件 在这篇博客中我将讲解解析JSON文件 在解析JSON文件时我使用的解析库是jsoncpp 编译平台是VS2019 希望看完本篇博客能对你有所帮助 JSON简介 在学习解析JSON文件之前 我们应该
  • 7-7 最大公约数和最小公倍数 (15 分)

    include
  • SQL了解之复制(二)

    续 从另一个master初始化slave 前面讨论的假设你是新安装的master和slave 所以 slave与master有相同的数据 但是 大多数情况却不是这样的 例如 你的master可能已经运行很久了 而你想对新安装的slave进行
  • 《python源代码分析》笔记 pythonVM一般表达式

    本文senlie原版的 转载请保留此地址 http blog csdn net zhengsenlie 1 字节码指令 LOAD CONST 从consts表中读取序号为i的元素并压入到执行时栈中 STORE NAME 改变local名字空