对输入文件的词频统计

(1)程序分析

 1 # filename: word_freq.py
 2 #  注意:代码风格
 3 
 4 
 5 import argparse
 6 import re
 7 
 8 def process_file(dst):     # 读文件到缓冲区
 9     try:     # 打开文件
10         file=open(dst,'r',encoding='ISO-8859-1')
11     except IOError as s:
12         print('IOError',s)
13         return None
14     try:     # 读文件到缓冲区
15         bvffer=file.read()
16     except:
17         print("Read File Error!")
18         return None
19     file.close()
20     return bvffer
21 #该函数采用ISO-8859-1的方法读取txt文件,若使用utf-8读取,《飘》中开头的换行将会提示错误
22 
23 
24 
25 def process_buffer(bvffer):
26     if bvffer:
27         word_freq = {}
28         # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
29         content=bvffer.lower()
30         regex=re.compile('[^a-zA-Z\s]')
31         content_result=regex.sub('',content)
32         content_result.lower()
33 
34         content_result.replace('/n',' ')
35         content_result=content_result.split(' ')
36         for word in content_result:
37              word_freq[word] = word_freq.get(word, 0) + 1
38     
39         return word_freq
40 #该函数处理缓冲区的bvffer,采用了正则表达式来将非空格和字母去除,并将大写改为小写后根据空格来分割 ,并采用wors_freq字典统计词频。
41 
42 
43 
44 def output_result(word_freq):
45     if word_freq:
46         sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
47         for item in sorted_word_freq[:10]:  # 输出 Top 10 的单词
48             print(item)
49 #输出排序后前十的元素
50 
51 
52 if __name__ == "__main__":
53     parser = argparse.ArgumentParser()
54     parser.add_argument('dst')
55     args = parser.parse_args()
56     dst = args.dst
57     bvffer = process_file(dst)
58     word_freq = process_buffer(bvffer)
59     output_result(word_freq)
60 #接受参数dst 并最为程序入口依次执行

(2)代码风格

  • 括号内换行第二行缩进4个空格,适用于起始括号就换行的情形

(3)程序运行命令、运行结果截图 

(4)性能分析结果及改进

  • 指出寻找执行时间、次数最多的部分代码;(1分)

        可以看出字典的get()方法执行了411610次,单词时间达到了0.054s,可见开销是很大的。

  • 尝试改进程序代码 

        

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

原代码如上,将get()方法弃用,改为以下代码:

1  for word in content_result:
2              # word_freq[word] = word_freq.get(word, 0) + 1
3              if word_freq.__contains__(word):
4                  word_freq[word] =  word_freq[word] + 1
5              else:
6                  word_freq[word] = 1

使用cprofile运行如下:

可以发现执行次数减少了很小的一部分(else分支分流了),但是单词时间减少为0.044s,从而使整体的执行时间由0.35s下降到了0.318s,所以改进这一处代码是有效的优化。

猜你喜欢

转载自www.cnblogs.com/vandarkhole/p/9746137.html