zoukankan      html  css  js  c++  java
  • 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]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。

     class A:
    
        def test(self):
            pass
    
        def test2(self):
            print "aaa"

    调用dis.dis(A)会得到如下结果(不同版本的Python得到的指令可能不一样)

    Disassembly of test:
      3           0 LOAD_CONST               0 (None)
                  3 RETURN_VALUE       
    
    Disassembly of test2:
      5           0 LOAD_CONST               1 ('aaa')
                  3 PRINT_ITEM         
                  4 PRINT_NEWLINE      
                  5 LOAD_CONST               0 (None)
                  8 RETURN_VALUE
    
    dis.dis(A.test)
      3           0 LOAD_CONST               0 (None)
                  3 RETURN_VALUE

    至于每个指令的实现可以参考Python-2.4.4/Python/ceval.c中的实现,大部分指令的可读性还是比较好的。

    通过dis模块包含的一些雷属性可以了解到Python字节码指令的信息。

  • 相关阅读:
    NUMBER BASE CONVERSION(进制转换)
    2776 寻找代表元(匈牙利算法)
    最长严格上子序列(二分优化)
    c++ bitset类的使用和简介
    笨小猴 2008年NOIP全国联赛提高组
    三国游戏 2010年NOIP全国联赛普及组
    全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
    codevs 1704 卡片游戏
    热浪
    全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  • 原文地址:https://www.cnblogs.com/exclm/p/3378241.html
Copyright © 2011-2022 走看看