作业三
1) 自己的基本信息:
- 学号:2017*****1035;
- 姓名:陈慧霖
- 码云仓库地址:https://gitee.com/chl035/word_frequency
2) 程序分析,对程序中的四个函数做简要说明。要求附上每一段代码及对应的说明。
第一段:打开并读取文件到缓冲区
1 def process_file(dst): # 读文件到缓冲区 2 try: # 打开文件 3 f = open(dst) 4 except IOError as s: 5 print (s) 6 return None 7 try: # 读文件到缓冲区 8 bvffer = f.read() 9 except: 10 print ("Read File Error!") 11 return None 12 f.close() 13 return bvffer
第二段:添加处理缓冲区bvffer代码,统计每个单词的频率,对文本特殊符号进行修改,并读入字典word_freq
1 def process_buffer(bvffer): 2 if bvffer: 3 word_freq = {} 4 # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq 5 for item in bvffer.strip().split(): 6 word = item.strip(punctuation+' ') 7 if word in word_freq.keys(): 8 word_freq[word] += 1 9 else: 10 word_freq[word] = 1 11 return word_freq
第三段:设置输出函数,进行排序并输出Top 10 的单词,统计词频
1 def output_result(word_freq): 2 if word_freq: 3 sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True) 4 for item in sorted_word_freq[:10]: # 输出 Top 10 的单词 5 print(item)
第四段:调用main函数,输出至控制台
1 if __name__ == "__main__": 2 import argparse 3 parser = argparse.ArgumentParser() 4 parser.add_argument('dst') 5 args = parser.parse_args() 6 dst = args.dst 7 bvffer = process_file(dst) 8 word_freq = process_buffer(bvffer) 9 output_result(word_freq)
3) 性能分析结果及改进。
程序运行命令、运行结果截图
用命令python -m cProfile word_freq.py Gone_with_the_wind.txt运行:
分析:Gone_with_the_wind.txt文件大小是2.25 M
总共有869127次函数调用,程序总共耗时0.443秒
指出执行次数最多的代码
执行时间最长的代码
给出改进优化的方法以及你的改进代码
应改把执行时间最长的代码优化一下,函数process_buffer函数中有一行代码:
if word in word_freq.keys():
该代码在for循环中,有多少单词,这个循环就会执行多少遍,每次进行条件判断的时候都要执行一次字典的keys方法,所以耗时很多。于是把keys去除,该行代码变为:
if word in word_freq:
4)改进后的程序运行命令及结果截图 。
运行命令python word_freq.py Gone_with_the_wind.txt
改进后:
分析:总共有449147次函数调用,程序总共耗时0.349秒
运行速度提升明显。
5) 给出你对此次任务的总结与反思。
复习了词频统计这个程序,这次作业让我了解了性能分析,更加深入学习了python这门语言,我应该多看一些如何优化代码的教程,以后有能力继续优化这个程序。