飞机场场长

本博客主要摘录python相关的知识,欢迎参阅。

导航

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

 

posted on 2013-05-15 16:30  飞机场场长  阅读(1878)  评论(0编辑  收藏  举报