Python代码分析工具之dis模块
http://hi.baidu.com/tinyweb/item/923d012e8146d00872863ec0
代码分析不是一个新的话题,代码分析重要性的判断比较主观,不同的人有不同的认识。Python是用C来实现的,所以对于Python的性能或代码质量的评估可以通过dis模块获取到对应的字节码指令来进行评估。
Python代码是先被编译为Python字节码后,再由Python虚拟机来执行Python字节码(pyc文件主要就是用于存储字节码指令的)。一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来确认一段程序的性能。
一个Python的程序会有若干代码块组成,例如一个Python文件会是一个代码块,一个类,一个函数都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。
dis模块主要是用来分析字节码的一个内置模块,经常会用到的方法是dis.dis([bytesource]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。
1 #-*-coding=utf-8-*- 2 import dis 3 4 class A: 5 def test(self): 6 pass 7 def test2(self): 8 print "aaa" 9 dis.dis(A)
输出:
Disassembly of test: 13 0 LOAD_CONST 0 (None) 3 RETURN_VALUE Disassembly of test2: 15 0 LOAD_CONST 1 ('aaa') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE
http://blog.csdn.net/dbzhang800/article/details/6766284
1 >>> c = compile("1+2", "test.py", "single") 2 >>> import dis 3 >>> dis.dis(c) 4 1 0 LOAD_CONST 3 (3) 5 3 PRINT_EXPR 6 4 LOAD_CONST 2 (None) 7 7 RETURN_VALUE
最开始的那个1是行号,指令码前面的数字是它在co_code中的索引。
1 import dis 2 3 source = open('./demo.py').read() 4 co = compile(source, './demo.py', 'exec') 5 6 dis.dis(co) 7
输出: 8 1 0 LOAD_CONST 0 (1) 9 3 STORE_NAME 0 (i) 10 6 LOAD_CONST 1 (None) 11 9 RETURN_VALUE