python代码在执行的时候,会被编译为python字节码,再由python虚拟机执行python字节码。有时候就我们执行python文件的时候会生成一个pyc文件,这个pyc文件即用于存储python字节码指令,而这些字节码是一种类似于汇编指令的中间语言,但是每个字节码对应的不是机器指令,而是一段c代码。
而dis模块,就是用于查看这些字节码的运行轨迹,因此我们可以用dis模块判断两个函数的内存占用谁会更大,谁会更消耗cpu性能,不仅如此,通过指令,我们还可以知道python中一些内置函数、变量的取值过程、运行逻辑,对于我们优化代码很有帮助。
下面将通过两个例子,来介绍dis模块的使用。
1.为什么下面第一个函数比第二个函数耗得内存更少?
一般人是比较难直接看出来的,但是我们使用dis模块却能很容易找到答案:
结果:
dis的结果其实很容易阅读:
第一列: 对应的源代码行数。
第二列: 对应的内存字节码的索引位置。
在第一列和第二列之间的 >> 号表示跳转的目标
第三列: 内部机器代码的操作。
第四列: 指令参数。
第五列: 实际参数。
两个函数的dis分析用*号隔开了,大家可以清晰地看到两个函数之间的语句区别。第二个函数的字节码索引最大到了30,而第一个函数的字节码索引最大仅到了22,因此,第一个函数耗得内存比第二个函数少。
而且,在第一列和第二列之间的 >> 号表示跳转的目标,大家可以看第二个函数第四列的 18,表示其跳转到了索引为18的指令,也就是rot_two。第二个函数的跳转也比第一个函数多,这也可能导致其在某种特殊情况下的效率可能会比第一个函数低。
2.为什么python2中,whil****e true 比 while 1慢?
while 1: passwhile true: pass可以通过在命令中使用dis进行分析:
可以看到,while 1 在第二行是直接jump_absolute,因此相比于while true 少了load_name 和 pop_jump_if_false。这是因为true在python2中不是一个关键字,而是一个内置变量,因此每次python都会用load_name去检查(pop_jump_if_false)true的值。这就是为什么while true 比while 1慢的原因。
到了python3,true变成了关键字,就没有这个问题了:
python 3 针对 python 2 做了非常多的替换,这也是为什么它不兼容 python 2 的原因之一,差别太大了。因此,建议各位初学者直接上手 python 3 进行学习,而非 python 2.
希望以上两个dis模块的使用例子能给大家带来一点灵感,分析一段python代码的深层次性能问题虽然比较费时费力,但是一旦你分析到了深层次的性能原因,将能累积不少深层次的技术上的知识,写出更漂亮的代码。
mosfet和mos管的区别 MOSFET的工作原理
15课:单片机位操作指令
2020年英特尔PC销量创下历史新纪录
揭秘未来城市物联网里的“神器”
探究STM32、FreeRTOS低功耗设计思路和原理
Dis模块的使用
口碑最好的国产蓝牙耳机 年度口碑降噪蓝牙耳机排行
ICPark为集成电路设计打辅助,促进企业科技创新
三相电机的功率计算 三相电机的接线方式
董明珠最终还是没hold住,格力手机2代降价300
便携式漏电动作时间检测仪
波峰焊连焊现象原因及解决方法
国产系统deepin安装教程_国产系统deepin怎么样
如何充分发挥传输SDN的全部潜力
如何将土壤湿度传感器和ESP8266连接到IoT云
如何使用带定时器的中断
高度可靠、精密测量控制的热式气体质量流量控制器
最新5G标准必要专利报告,华为排名第一中兴第三
东芝推出可在高温下应用的车载功率MOSFET
年度参测数据中心PUE平均值