一、编译环境

(1)测试工具:Pycharm Edu 2017

 (2) python版本:3.6.4

二、程序分析

(1)读文件到缓冲区

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

(2)处理缓冲区,统计每个单词频率

def process_buffer(bvffer):  # 处理缓冲区,返回存放每个单词频率的字典word_freqif bvffer:# 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freqword_freq = {}# 将文本内容都改为小写且去除文本中的中英文标点符号for ch in '“‘!;:,.?”':bvffer = bvffer.lower().replace(ch, " ")# strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串words = bvffer.strip().split()for word in words:word_freq[word] = word_freq.get(word, 0) + 1return word_freq

(3)输出频率前十的单词

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("单词:%s 频数:%d " % (item[0], item[1]))

(4)主函数调用前面已封装的函数

if __name__ == "__main__":path = "Gone_with_the_wind.txt"  # 《飘》文件的路径bvffer = process_file(path)word_freq = process_buffer(bvffer)output_result(word_freq)

三、代码风格说明

(1)python与其他编程语言很大不同是在于没有分号以及花括号,所以python对于空格要求很高,不能使用tab缩进,否则会报IdentationError;

(2)使用try-except的时候,PyCharm在except单词上提示:too broad exception clause,此时需要在try上面加#noinspection PyBroardException;

(3)UTF-8和GBK是两种不同编码,有时乱码的原因是因为编码格式没调;

(4)python2和python3在输出上写法不同,python3的print是一个函数,要加括号;

四、程序运行结果截图

1.Pycharm中运行Gone_with_the_wind.txt结果

2.运行A_Tale_of_Two_Cities结果

五、性能分析结果及改进

(1)性能分析代码

def main():  # main函数封装词频运行path = "Gone_with_the_wind.txt"bvffer = process_file(path)word_freq = process_buffer(bvffer)output_result(word_freq)if __name__ == "__main__":import cProfileimport pstatscProfile.run("main()", filename="word_freq.out")# 创建Stats对象p = pstats.Stats('word_freq.out')# 输出调用此处排前十的函数# sort_stats(): 排序# print_stats(): 打印分析结果,指定打印前几行p.sort_stats('calls').print_stats(10)# 输出按照运行时间排名前十的函数# strip_dirs(): 去掉无关的路径信息p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)# 根据上面的运行结果发现函数process_buffer()最耗时间# 查看process_buffer()函数中调用了哪些函数p.print_callees("process_buffer")

说明:

ncalls:表示函数调用的次数;

tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;

percall:(第一个percall)等于 tottime/ncalls;

cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;

percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls;

filename:lineno(function):每个函数调用的具体信息;

(2)执行时间最长的代码

for ch in '“‘!;:,.?”':bvffer = bvffer.lower().replace(ch, " ")

(3)执行次数最多的代码

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

(4)使用可视化工具进行分析

(5)代码改进

将bvffer.lower()放到for循环外

修改后代码:

bvffer = bvffer.lower()# 将文本内容都改为小写且去除文本中的中英文标点符号for ch in '“‘!;:,.?”':bvffer = bvffer.replace(ch, " ")# strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串

修改前性能分析图:

修改后性能分析图:

可以看出比原来快了0.247s。

转载于:https://www.cnblogs.com/ttsscc000/p/9763763.html

软工作业3:词频统计相关推荐

  1. 软工作业3—词频统计

    一.案例课程分析 1.编译环境 pycharm2018.python3.7 2.读文件到缓存区(process_file(dst)) def process_file(dst): # 读文件到缓冲区 ...

  2. 软工作业 5:词频统计——增强功能

    一.基本信息 1.1 编译环境.项目名称.作者 1 #编译环境:python3.6 2 #项目名称:软工作业5-词频统计-增强功能 3 #作者:1613072055 潘博 4 # 1613072056 ...

  3. 第一次软工作业展示——潘学

    第一次软工作业完成啦! 回首这个作业的完成过程,我是很有收获.这个作业有几个难点:1.在给定目录下读取TXT文件的内容:2.从读到的内容中分析出单词:3.统计单词的出现频率并输出. 我之前只学习过C和 ...

  4. 第三次软工作业——实现最大字段和算法并进行判定条件覆盖

    第三次软工作业 实现最大子段和的算法并进行条件组合覆盖测试 (一)什么是最大子段和? 我自己的理解: 一个数组可以若干个子数组,包含自身.每一个字数组都有一个数组元素之和,求这些和之间的最大值. 最朴 ...

  5. 第一次软工作业(构建之法)

    第一次软工作业(构建之法) 关于构建之法的若干个问题 1.第一章32页,原文:"有人认为,"中文编程",是解决程序员编程效率的一个秘密武器,请问它是一个"银弹& ...

  6. 第一次软工作业(数独)

    第一次软工作业(数独) 1.该项目的github地址: https://github.com/514DNA/sudoku 2.各个模块耗费的时间: PSP2.1 Personal Software P ...

  7. java大作业国际比赛奖牌榜,java大作业之词频统计

    [实例简介] 开发工具idea,统计方式为java8的stream方式,不是传统的字节流统计方式,内含答辩PPT以及统计单词的文本,配置好后可直接使用 [实例截图] [核心代码] java大作业之词频 ...

  8. 软工作业3: 词频统计

    词频统计 一.编译环境 (1)IDE:PyCharm 2018 (2)python版本:python3.6.3(Anaconda3-5.1.0  ) 二.程序分析 (1)读文件到缓冲区(process ...

  9. 软工作业4:词频统计

    一.基本信息 # 编译环境:Pycharm2018.Python3.7# 项目名称:词频统计--基本功能(结对编程)# 作者: 1613072050:马钰# 1613072051:朱佳豪# 16130 ...

  10. 2019/3/14 软工作业

    自我介绍 2017xxxxx1066:我是骆树仁:我的爱好是揉白泽球: 我的码云个人主页是:https://gitee.com/sturdast/events 我的第一个项目地址是:https://g ...

最新文章

  1. showdoc windows 搭建_ShowDoc的搭建
  2. solaris mysql_配置Solaris下自带的MYSQL
  3. gdal数据类型_科学网-gdal数据类型的代码的核心定义文件-林清莹的博文
  4. YARN REST API
  5. java连接数据库(sqlserver和mysql)
  6. oracle in table类型,Oracle Built-in Data Types(Oracle内置数据类型)
  7. 计算机操作系统 (第四版汤小丹老师) 复习笔记完整版——第一章:操作系统引论
  8. linux环境下安装curl,Linux环境下curl安装和移植
  9. 使用HTML语法图文混排
  10. SqlHelper的封装
  11. 冒泡排序原理+冒泡排序代码详解
  12. python-django前端传递数据的三种格式_CBV源码分析_django模板语法
  13. 计算机组装日记,求微机组装与维护实习日记?
  14. [html + css] SVG动画 发光渐变炫彩猫猫头
  15. Microsemi Libero系列教程(二)——新建点灯工程
  16. 周边pd是什么意思_偶像练习生张艺兴张pd是什么意思
  17. 故障诊断分类 matlab代码 轴承内圈、外圈、滚动体故障分类
  18. ros入门保姆级教程之召唤小乌龟
  19. 查询时报错The error may involve defaultParameterMap ### The error occurred while setting parameters
  20. 数学基础 - 第十五章 分式

热门文章

  1. (转)layoutSubviews总结
  2. 为什么用抽象三层结构
  3. FPGA/CPLD按键硬件延时消除抖动的思路
  4. C#字符串处理插入(Insert)函数
  5. 设置Eclipse智能提示(转)
  6. 为什么要使用设计模式?
  7. 自动控制进行频率分析用计算机,自动控制7 用MATLAB进行系统-频率特性分析.doc...
  8. 车辆动力学及控制_道路自适应车辆动力学控制研究(127页)【附下载】
  9. linux字符设备驱动架构,linux驱动开发--字符设备:cdd_cdev结构中private_data使用
  10. tomcat线程释放时间_聊下并发和Tomcat线程数(错误更正)