runxinzhi.com
首页
百度搜索
课后作业3:个人项目(词频统计及其效能分析)
基本信息
**1. 博客开头给出自己的基本信息,格式建议如下:** 学号:2017*****7239; 姓名:王和旋; 码云项目仓库:[https://gitee.com/KONG520/word_frequency/tree/SE7239/](https://gitee.com/KONG520/word_frequency/tree/SE7239/)
程序分析
**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的单词和次数: ![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327183058576-1237238208.png)
性能分析与改进
**3. 简单性能分析并改进、提交代码** 使用cProfile进行性能分析 ```python -m cProfile word_freq.py Gone_with_the_wind.txt``` 测试结果如下图(由于测试数据太多,只列举截图了关键信息,耗时最长,调用最多次数的函数): ![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327184153671-817211859.png) 上图显示有866682次函数调用,程序总共耗时370.584秒 ![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327184911631-1874487593.png) ![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327185151681-1455941333.png) 上图中标记的第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:
![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327190444297-812688018.png) 再次进行性能分析,结果如下: ![](https://img2018.cnblogs.com/blog/1329194/201903/1329194-20190327191616676-600579185.png) 显示446536次函数调用共用了0.403秒,程序的函数调用次数和总运行时间明显减少.
总结反思
**4. 总结反思** 性能分析的意义:找到代码的性能瓶颈,将执行次数多和耗时长的代码优化,使得变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少。
引用一段网上找到的话:
二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少)。因此优化实践中,我们将精力集中优化那20%最耗时的代码上,这那20%的代码就是程序的性能瓶颈,主要针对这部分代码进行优化。
作者
:
挑战风车的喵
出处
:
https://www.cnblogs.com/kongw/
个性签名
:夜空中最亮的星, 请指引我前行!
如果觉得这篇文章对你有帮助的话, 记得在下面点个"
推荐
"哦~, 博主在此感谢!!!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
相关阅读:
深入理解Java:注解(Annotation)--注解处理器
Java进阶之reflection(反射机制)——反射概念与基础
JAVA 动态代理
注解是建立在class文件基础上的东西,同C语言的宏有异曲同工的效果
Android 进阶8:进程通信之 Binder 机制浅析
Android Binder机制(一) Binder的设计和框架
Android Service初解
原生sql和 TP sql怎么关联?
Laravel 修改默认日志文件名称和位置
laravel asset()函数
原文地址:https://www.cnblogs.com/kongw/p/10607954.html
最新文章
【MongoDB】在windows平台下搭建mongodb的分片集群(二)
GoldentGate Oracle to Oracle 初始化具体解释
程序猿的奋斗史(三十七)——大学断代史(一)——开篇
486E
【Ubuntu】升到14,攻克了进入用户后没有菜单条导航栏的问题
mysql存储过程及经常使用函数
颜色空间转换
我所理解的Android和iOS上的View
OpenGL ES
Core Animation
热门文章
CAEAGLLayer
iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)
Android
Android开发——View的生命周期总结
为什么有些异常throw出去需要在函数头用throws声明,一些就不用
Java 中的异常和处理详解
android Adapter总结
Android中Adapter和Bridge模式理解和应用
registerDataSetObserver:浅析Andorid ListView和Adapte
java 类名.this
Copyright © 2020-2023
润新知