0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Dis模块的使用

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-02 15:27 次阅读

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:
    pass

while 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代码的深层次性能问题虽然比较费时费力,但是一旦你分析到了深层次的性能原因,将能累积不少深层次的威廉希尔官方网站 上的知识,写出更漂亮的代码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2707

    浏览量

    47474
  • DIS
    DIS
    +关注

    关注

    0

    文章

    17

    浏览量

    16460
  • 虚拟机
    +关注

    关注

    1

    文章

    917

    浏览量

    28197
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84689
收藏 人收藏

    评论

    相关推荐

    OPA548 DIS是高阻态还是什么状态?

    如图:支持利用E/S脚的EN/DIS功能, 想知道 1.DIS是高阻态还是什么状态, 2.1. 从有输输出到输入DIS电平,到输出延时时间是多少 2.2.从DIS无输出到输入EN电
    发表于 09-02 06:54

    请问OPA695 DIS要怎么接?

    请问OPA695DIS要怎么接?
    发表于 09-06 07:57

    探究python字节码

    玩这个,Python标准库中的dis模块就非常有用了; dis模块为Python字节码提供了一个“反汇编程序”,从而可以轻松获取人为可读的版本并查找各种字节码指令。
    发表于 05-22 15:48

    无法闪现开发SPC560B-Dis

    大家好,感谢您的时间和帮助。我正在使用SPC560B-DIS开发板和spc5studio IDE。突然当我试图闪存开发板时,我在日志中遇到错误说:错误,Core :: PpcJtagTargIntf
    发表于 01-28 10:36

    DIS仿真系统中的计算机生成兵力研究

    在分析DIS 仿真系统框架的基础上,讨论了仿真系统中的进攻方CGF 系统的实体动态模型、自治行为产生和操作员控制,最后说明了仿真系统中的时空一致性问题。对研究基于DIS 的计
    发表于 03-29 14:37 15次下载

    ARM设计的DIS采集系统方案

    ARM设计的DIS采集系统方案 数字化信息系统实验室(Digital Information System,DIS)是新一代的中小学实验教学系统,是先进的数字威廉希尔官方网站 应用到
    发表于 04-28 10:05 1369次阅读
    ARM设计的<b class='flag-5'>DIS</b>采集系统方案

    基于ARM的DIS采集系统设计

    2006年,教育部将DIS纳入了中小学实验仪器装备标准,建议有条件的学校配备。目前,国内已有多家企业有相应的产品,但大多不够成熟。而国外的类似产品虽然较为成熟,但价格偏
    发表于 07-21 15:46 1088次阅读
    基于ARM的<b class='flag-5'>DIS</b>采集系统设计

    LA46 DIS 09911-1_0126联想B460 电路图

    LA46 DIS 09911-1_0126联想B460 电路图
    发表于 02-14 16:10 87次下载

    基于SPC582B-DIS微控制器的参考设计

    View the reference design for SPC582B-DIS. //www.obk20.com/soft/ has thousands of reference designs to help bring your project to life.
    发表于 07-09 16:43 2次下载
    基于SPC582B-<b class='flag-5'>DIS</b>微控制器的参考设计

    彗星DIS SI1构建原理图下载

    彗星DIS SI1构建原理图下载
    发表于 07-16 09:58 0次下载

    基于SPC560B-DIS微控制器的参考设计

    View the reference design for SPC560B-DIS. //www.obk20.com/soft/ has thousands of reference designs to help bring your project to life.
    发表于 08-31 18:14 2次下载
    基于SPC560B-<b class='flag-5'>DIS</b>微控制器的参考设计

    基于SPC560D-DIS微控制器的参考设计

    View the reference design for SPC560D-DIS. //www.obk20.com/soft/ has thousands of reference designs to help bring your project to life.
    发表于 08-31 18:16 3次下载
    基于SPC560D-<b class='flag-5'>DIS</b>微控制器的参考设计

    Dis预测意外情况

    ./oschina_soft/dis.zip
    发表于 06-13 11:31 4次下载
    <b class='flag-5'>Dis</b>预测意外情况

    ZIWBO0/ZIWB1/ZIWEO DIS M/B示意图文件

    ZIWBO0/ZIWB1/ZIWEO DIS M/B示意图文件
    发表于 04-17 10:52 1次下载

    python 使用Dis模块进行代码性能剖析

    就像一个黑匣子,很多时候我们不知道python内部是怎样执行代码的,而且DEBUG的时候也没有机器指令可以查看,非常不利于代码优化。但是没关系,现在我们有Dis模块来对代码进行性能剖析。 为什么下面
    的头像 发表于 11-03 15:39 578次阅读
    python 使用<b class='flag-5'>Dis</b><b class='flag-5'>模块</b>进行代码性能剖析