Python代码在执行的时候,会被编译为Python字节码,再由Python虚拟机执行Python字节码。有时候就我们执行python文件的时候会生成一个pyc文件,这个pyc文件即用于存储Python字节码指令,而这些字节码是一种类似于汇编指令的中间语言,但是每个字节码对应的不是机器指令,而是一段C代码。

而Dis模块,就是用于查看这些字节码的运行轨迹,因此我们可以用Dis模块判断两个函数的内存占用谁会更大,谁会更消耗CPU性能,不仅如此,通过指令,我们还可以知道Python中一些内置函数、变量的取值过程、运行逻辑,对于我们代码性能并优化代码很有帮助。

下面将通过两个例子,来介绍Dis模块的使用。

1.为什么下面第一个函数比第二个函数耗得内存更少?

def test1(a):

if 0 < a and a < 1:

return 1

return 0

def test2(a):

if 0 < a < 1:

return 1

return 0

一般人是比较难直接看出来的,但是我们使用Dis模块却能很容易找到答案:

import dis

def test1(a):

if 0 < a and a < 1:

return 1

return 0

def test2(a):

if 0 < a < 1:

return 1

return 0

dis.dis(test1)

print('*'*50)

dis.dis(test2)

结果:

dis结果

Dis的结果其实很容易阅读:

第一列:对应的源代码行数。

第二列:对应的内存字节码的索引位置。

在第一列和第二列之间的 >> 号表示跳转的目标 第三列:内部机器代码的操作。

第四列:指令参数。

第五列:实际参数。

两个函数的dis分析用*号隔开了,大家可以清晰地看到两个函数之间的语句区别。第二个函数的字节码索引最大到了30,而第一个函数的字节码索引最大仅到了22,因此,第一个函数耗得内存比第二个函数少。

而且,在第一列和第二列之间的 >> 号表示跳转的目标,大家可以看第二个函数第四列的 18,表示其跳转到了索引为18的指令,也就是ROT_TWO。第二个函数的跳转也比第一个函数多,这也可能导致其在某种特殊情况下的效率可能会比第一个函数低。

2.为什么Python2中,while 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代码的深层次性能问题虽然比较费时费力,但是一旦你分析到了深层次的性能原因,将能累积不少深层次的技术上的知识,写出更漂亮的代码。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦!有任何问题都可以在下方留言区留言,我们都会耐心解答的!

​Python实用宝典 (pythondict.com)

不只是一个宝典

欢迎关注公众号:Python实用宝典

pythondis功能_python 使用 Dis 模块进行代码性能剖析相关推荐

  1. pythondis功能_python中dis的用法

    dis库是python(默认的CPython)自带的一个库,可以用来分析字节码 例子 首先导入dis库 >>> import dis 然后在repl中,创建一个函数 >> ...

  2. python解析xml生成代码_python解析xml模块封装代码

    有如下的xml文件: 复制代码 代码如下: 1 2 下面介绍python解析xml文件的几种方法,使用python模块实现. 方式1,python模块实现自动遍历所有节点: 复制代码 代码如下: #! ...

  3. python编写代码实现文件的拷贝功能_python利用os模块编写文件复制功能——copy()函数用法...

    我就废话不多说了,大家还是直接看代码吧~ #文件复制 import os src_path=r'E:\Pycharm\python100题\代码' target_path=r'E:\Pycharm\p ...

  4. python的requests模块功能_python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  5. pythonwx功能_python中wx模块的具体使用方法

    wx包中的方法都是以大写字母开头的,而这和Python的习惯是相反的. 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 根据自 ...

  6. python解析xml文件选用模块_python解析xml模块封装代码

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  7. python测试代码性能_使用python timeit 模块检测代码性能

    使用Python 通常在乎的是它的开发效率,而不是运行性能. 但如果通过很简单的方法可以测试出n种不同的写法之间的性能差异,这个过程本身也是一种乐趣. python 自带了timeit 模块,可以在代 ...

  8. ROS实现串口GPS数据的解析与通信(这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样)

    我发现这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样!!! https://gitee.com/maxibooksiyi/gps_driver 转载自:https://blo ...

  9. python的继承模式_Python之继承--增加新功能,不更改以前的代码

    在实际工作中,设计模式的时候,要增加新功能,不要更改以前的代码,这是封装和继承的高度总结. isinstance('对象',"类") 返回Ture or False issubcl ...

最新文章

  1. cookiesession的QA故事[原理篇]
  2. 三摄正普及,四摄在路上?谷歌逆天AI算法,只做单摄虚化
  3. 互联网跨界营销掘金“大数据”
  4. Pivotal发布Spring Cloud Data Flow 1.5版本
  5. 机械秒表的使用方法_瓦楞纸箱防水性能检测方法
  6. php+页面加载进度,基于jQuery实现模拟页面加载进度条_jquery
  7. wpf tabitem 点击事件_Mindfusion教程:WPF中的Fishbone(Ishikawa)图
  8. 企业级 SpringCloud 教程 (五)路由网关(zuul)
  9. 10.15 iptables filter表小案例;10.16—10.18 iptables nat
  10. python数据包pandas_python | 数据分析(二)- Pandas数据包
  11. 文件编辑vim常用命令
  12. PHP有哪些基本数据类,PHP的基本数据类型
  13. 前端工程师的价值体现在哪里?
  14. excel文档中了宏病毒--
  15. [欧范 必备]帅气 中性 军色 工装 铜扣勋章 休闲衬衣 男女通款
  16. html页面国际化之谷歌翻译js实践,支持通过判断浏览器语言自动将中文翻译成英文
  17. 四年级关于计算机的知识,小学四年级下册信息技术教案
  18. Java---CountDownLatch
  19. 周鸿祎产品秘笈:小版本成就大产品
  20. 微型计算机ccc认证依据,3C检测规定

热门文章

  1. [Remoting]dotNet Framework升级后Remoting信道使用的安全问题
  2. SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -1(服务器视角)...
  3. UML与软件建模 第五次作业
  4. WPF TreeView IsExpanded 绑定不上的问题
  5. (47)LINUX应用编程和网络编程之二Linux文件属性
  6. 为什么站点使用https加密之后还能看到相关数据
  7. 算法之最长公共子序列(LCS)问题
  8. [转载]数据库外键的使用
  9. sourceTree初识
  10. Windows8.1下安装NoSQL-- mongodb安装使用