第三次作业——效能分析
此作业的要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145]
该作业git地址为:https://git.coding.net/qiaojingyu/wf_proFile.git
要求0:以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。
因为本次作业使用的是python语言,所以使用命令行输入以下代码:
python -m cProfile wf.py -s < war_and_peace.txt
得到的运行时间分别如下:
1.第一次运行:
2.第二次运行:
3.第三次运行:
次数 |
时间(s) |
1 |
0.614 |
2 |
0.636 |
3 |
0.622 |
平均 |
0.624 |
CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz
要求1:要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化。
(1)sorted()函数对词频进行排序时会比较耗时,所以上周已经进行优化。将读入的数据存入两个字典,分两部分排序,最后合并排序。
(2)猜测将读取的文件进行小写转换、字符转换后存入字典这一操作会耗时较长。但是上述操作在词频统计中是必须操作,猜想可以优化标点符号替换操作(将标点符号封装起来)。
# 单词格式化:去掉分词之后部分英文前后附带的标点符号 for word in y: # last character of each word word1 = word # use a list of punctuation marks while True: lastchar = word1[-1:] if lastchar in [",", ".", "!", "?", ";", '"',"-","*","%"]: word2 = word1.rstrip(lastchar) word1 = word2 else: word2 = word1 break while True: firstchar = word2[0:] if firstchar in [",", ".", "!", "?", ";", '"',"-","*","%"]: word3 = word2.lstrip(firstchar) word2 = word3 else: word3 = word2 break # build a wordList of lower case modified words word_list2.append(word3) #统计词频 tf = {} for word in word_list2: word = word.lower() # print(word) word = ''.join(word.split()) if word in tf: tf[word] += 1 else: tf[word] = 1 return tf
要求2:通过profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数或代码片段。
在命令行输入以下代码:
python -m cProfile -s time wf.py -s < war_and_peace.txt
该命令可以显示出程序中每个函数调用的次数以及运行时间,并对其按时间长短进行排序,看起来比较直观。
得到耗时前三名结果如下图红框内所示:
要求3:根据瓶颈,“尽力而为”地优化程序性能。
根据要求1中对程序瓶颈的猜想,优化后的代码如下所示:
while True: lastchar = word1[-1:] for lastchar in '\r .,"': word2 = word1.rstrip(lastchar) word1 = word2 else: word2 = word1 break while True: firstchar = word2[0:] for lastchar in '\r .,"': word3 = word2.lstrip(firstchar) word2 = word3 else: word3 = word2 break # build a wordList of lower case modified words word_list2.append(word3)
要求4:再次profile,给出在要求1 中的最花费时间的3个函数此时的花费。
再次输入代码:
python -m cProfile -s time wf.py -s < war_and_peace.txt
得到结果如下图所示:
1.第一次运行:
2.第二次运行:
3.第三次运行:
次数 |
时间(s) |
1 |
0.587 |
2 |
0.589 |
3 |
0.582 |
平均 |
0.586 |
CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz
对比可看出平均运行时间减少了0.038s。
要求5:程序运行时间。
等待教师测评。