软工作业3:个人编程练习--Python统计词频

正因为生来什么都没有,因此我们能拥有一切。 --《游戏人生》

 

一、程序分析

1、读文件到缓冲区

 1 def process_file(dst):     # 读文件到缓冲区
 2     try:     # 打开文件
 3         f = open(dst,'r')
 4     except IOError,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

2、缓冲区处理

 1 def process_buffer(bvffer):
 2     if bvffer:
 3         word_freq = {}
 4         # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
 5         bvffer.lower() # 把所有字母全部转化成小写
 6         char={"~@#$%^&*()_-+=<>?/,.:;{}[]|\'“”"}
 7         for ch in char :    
 8             bvffer=bvffer.replace(ch,' ')   # 除去标点符号,注意别忘记去除中文标点
 9         words=bvffer.strip().split()        # 单词分散成列表
10         for word in words:
11             word_freq[word]=word_freq.get(word,0) + 1
12         return word_freq

 3、打印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

4、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)

二、代码风格说明

Python语句书写规则如下。

(1)使用换行符分隔,一般情况下,一行一条语句。

(2)从第一列开始,前面不能有任何空格,否则会产生语法错误。

(3)复合语句中,结构体语句块相对头部语句缩进4个空格。

例如:1、读取文件到缓冲区的第1行、第2行、第3行 有4个空格的缩进。

三、程序运行截图

环境:Centos 7.5 64位  python 2.7.5 

命令:$ python word_freq.py Gone_with_the_wind.txt 

四、性能分析结果及改进

性能分析结果如下:

(点击图片查看大图)

点击图片查看大图

执行时间最长的代码是:process_buffer 缓冲区处理模块

执行次数最多的代码是:output_result 中的 sort 排序代码

(若有误,请指出!)

 

 

使用Gprof2Dot进行性能分析的图形结果如下:

(点击图片查看大图)

执行代码:

输出图形结果:

 点击图片查看大图

 

通过图形可以看到,split()方法 和 get()方法消耗了大量的时间。

改进思路,由于split()方法必须使用,所以不做改动。不使用get(),而是使用原始的判断方法来计数词频

原代码:

1 for word in words:
2     word_freq[word]=word_freq.get(word,0) + 1

 

修改后:

1 for word in words:
2     if word in word_freq:
3         word_freq[word] = word_freq[word] + 1
4     else:
5         word_freq[word] = 1

再次运行,查看性能分析:

(点击图片查看大图)

点击图片查看大图

点击图片查看大图

缓冲区处理模块的运行时间有所减少。

 

posted @ 2018-10-09 20:07  小林康娜  阅读(267)  评论(0编辑  收藏  举报