20190919-3 效能分析

作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/7628

代码git地址  https://e.coding.net/thiking/ci_pin.git

要求0 以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。

运行命令:

ptime wf -s < war_and_peace.txt

运行时间截图:

 

消耗时间汇总:

 

 CPU参数为:Intel(R)Core(TM)i5-4200M CPU @2.50GHZ 2.49GHZ

要求1 给出你猜测程序的瓶颈。

 瓶颈1:处理整个文本内容时遍历整个文档耗时较长

def process_buffer(bvffer):
    total = 0
    if bvffer:
        word_freq = {}
        bvffer = bvffer.lower()                       # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
        for ch in '“‘!;,.?”:""':                         #清除文档中的标点
            bvffer = bvffer.lower().replace(ch, " ")  #将所有字母转换成小写,并将所有标点转化为空格,便于统计,
        words = bvffer.strip().split()                #strip消除空白符,split以空格作为单词分界
        total = total + len(words)
        print("total: "+str(total)+" words")
        print('
')
        for word in words:
            word_freq[word] = word_freq.get(word, 0)+1   #读取到的单词存放到字典
        Output(word_freq)                               

瓶颈2:功能四函数过于冗杂

def counoutputText(inputText):          # 功能4 文本读入结果重定向至另外文件
    filepath = "D://"
    filename = "output.txt"
    fullname = filepath + filename
    standard_output = sys.stdout  # 备份默认的标准输出(输出值控制台)
    sys.stdout = open(fullname, "w+")  # 将标准输出重定向至文件
    process_buffer(inputText)  # 读入文本中
    sys.stdout.close()  # 关闭文件
    sys.stdout = standard_output  # 恢复默认标准输出

要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。 (5分)

 使用命令行:python -m cProfile -s time wf.py -s < war_and_peace.txt

 运行截图:

  

  其中:

    ncalls:表示函数调用的次数;

    tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;

    percall:(第一个percall)等于 tottime/ncalls;

    cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;

    percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls;

    filename:lineno(function):每个函数调用的具体信息;

  由测试结果可知:我的程序中最耗时的函数为“process_buffer”(处理文本,统计单词数量),“counoutputText”(重定向输出)以及main函数.

  耗时函数的排行为:

              1、main函数,函数的耗时为0.900 S

              2、counoutputText函数,函数的耗时为0.847 S

             3、process_buffer函数,函数的耗时为0.825 S

要求3 根据瓶颈,"尽力而为"地优化程序性能。 (5分)

 由于本人水平有限,尝试了好久对程序进行优化,但是始终没有成功,优化之后反而更慢,所以没有对程序做进一步的优化。

要求4 再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图。(2分)

由于没有对程序进行优化,所以花费时间仍然和上面保持一样。

 

原文地址:https://www.cnblogs.com/dongyahui/p/11574598.html