1. 博客开头给出自己的基本信息, 格式建议如下:
学号: 2017*****7212;
姓名: 张佳欢;
码云项目仓库:
2. 程序分析, 对程序中的四个函数做简要说明. 要求附上每一段代码及对应的说明.
首先声明编码方式和导入 string 模块中的 punctuation 方法
- # -*- coding: UTF-8 -*-
- from string import punctuation
1. 读取文件函数 -- 打开文件读入缓冲区并关闭文件
- def process_file(dst): # 读文件到缓冲区
- try: # 打开文件
- txt = open(dst, "r")
- except IOError, s:
- print s
- return None
- try: # 读文件到缓冲区
- bvffer=txt.read()
- except:
- print "Read File Error!"
- return None
- txt.close()
- return bvffer
2. 数据处理 -- 去除字符串中的符号将单词分割并读入字典.
- def process_buffer(bvffer):
- if bvffer:
- word_freq = {}
- # 下面添加处理缓冲区 bvffer 代码, 统计每个单词的频率, 存放在字典 word_freq
- for item in bvffer.strip().split():
- Word = item.strip(punctuation + ' ')
- if Word in word_freq.keys():
- word_freq[Word] += 1
- else:
- word_freq[Word] = 1
- return word_freq
3. 输出 Top10 结果 -- 遍历字典并输出 Top10 的单词
- def output_result(word_freq):
- if word_freq:
- sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
- for item in sorted_word_freq[:10]: # 输出 Top 10 的单词
- print(item)
4. 导入 argparse 库用于解析命令行数据, 依次执行函数
- if __name__ == "__main__":
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument('dst')
- args = parser.parse_args()
- dst = args.dst
- bvffer = process_file(dst)
- word_freq = process_buffer(bvffer)
- output_result(word_freq)
在命令中输入
python word_freq.py Gone_with_the_wind.txt
运行代码
结果如下, 输出了词频 Top10 的单词和次数:
3. 简单性能分析并改进, 提交代码
使用 cProfile 进行性能分析
python -m cProfile word_freq.py Gone_with_the_wind.txt
测试结果如下图(由于测试数据太多, 只列举截图了关键信息, 耗时最长, 调用最多次数的函数):
上图显示有 866682 次函数调用, 程序总共耗时 370.584 秒
上图中标记的第 3 点字符串的 strip 函数被调用的次数最多 --420147 次, 但花费总时间只用了 0.603 秒, 暂不需要优化
而第 1 点函数 process_buffer 只被调用了 1 次却用的 208.390 秒, 第 3 点字典中的 key 方法被调用了 420146 次, 用时 161.473 秒
回到代码中发现 process_buffer 函数中的 for 循环内有一句 if Word in word_freq.keys():
而遍历字典循环中每执行一次就要调用字典 word_freq 的 keys()方法, 但实际不需要再提取字典中的值 (keys), 直接判断 Word 在字典 word_freq 中是否存在就可以了, 所以去掉 keys() 方法, 将代码修改为 if Word in word_freq:
再次进行性能分析, 结果如下:
显示 446536 次函数调用共用了 0.403 秒, 程序的函数调用次数和总运行时间明显减少.
4. 总结反思
性能分析的意义: 找到代码的性能瓶颈, 将执行次数多和耗时长的代码优化, 使得变换后的代码运行结果与变换前的代码运行结果相同, 但执行速度加快或存储开销减少.
引用一段网上找到的话:
二八法则适合很多事物: 最重要的只占其中一小部分, 约 20%, 其余 80% 的尽管是多数, 却是次要的. 在程序代码中也是一样, 决定应用性能的就那 20% 的代码(甚至更少). 因此优化实践中, 我们将精力集中优化那 20% 最耗时的代码上, 这那 20% 的代码就是程序的性能瓶颈, 主要针对这部分代码进行优化.
个人项目(词频统计及其效能分析)
来源: http://www.bubuko.com/infodetail-3007580.html