• 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
  • 相关阅读:
    C#6.0新语法
    C#泛型详解
    C#下Hashtable和Dictionary之间的差别
    C#中HashTable的用法
    MySQL日志
    MySQL创建数据表并建立主外键关系
    MySQL函数的使用
    MySQL实现SQL Server排名函数
    Windows安装SVN服务器和客户端
    Oracle SQL Developer 免费的DB2客户端
  • 原文地址:https://www.cnblogs.com/lvxiuquan/p/3080071.html
Copyright © 2020-2023  润新知