目录
1.Github仓库地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 70 |
Estimate | 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 300 | 400 |
Analysis | 需求分析 (包括学习新技术) | 300 | 360 |
Design Spec | 生成设计文档 | 30 | 20 |
Design Review | 设计复审 | 30 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 420 | 520 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 180 |
Reporting | 报告 | 30 | 20 |
Test Report | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 30 |
合计 | 1520 | 1770 |
3.计算模块接口的设计与实现过程
计算模块接口设计:
代码设计流程图:
先将输入信息中的姓名与手机号提取出来,再将姓名号码和一些奇奇怪怪的标点符号剔除掉,接下来是对剩余的地址进行匹配,疯狂利用正则表达式来匹配出多级地址,最后一股脑按照json格式输出!
实现过程:
关键正则表达式匹配函数代码:
name = re.search(r'^[\u4e00-\u9fa5]{2,5}', text) #匹配姓名
phone = re.search('\d{11}', text) #匹配电话号码
province = re.search('([\u4e00-\u9fa5]{2,7})?(?:省|自治区)', address) #匹配第一级
city = re.search('[\u4e00-\u9fa5]{2,7})?(?:市|自治州|盟|地区)^(超市))', address2) #匹配第二级
region = re.search('([\u4e00-\u9fa5]{1,9}?(?:市|区|县))', address3) #匹配第三级
town = re.search('([\u4e00-\u9fa5]{2,7}?(?:街道|镇|乡))', address4) #匹配第四级
road = re.search('[\u4e00-\u9fa5]{2,7}?(?:村|路|街|巷)', address5) #匹配第五级
tag = re.search('\d{1,7}?(?:号|弄)', address6) #匹配第六级
这个程序的算法思想是一级一级往下匹配,每一级正则匹配一次提取相应内容后在输入信息中剔除。对于有一些名字比较奇怪的地方,在字典集里重新定义。
结果发现我实在是太南顶了,对于正则表达式还是现学现卖的,一些语法匹配规则(Pattern)是在是搞不懂,单个字符判断规则还是容易明白的,但是如果把一大堆花里胡哨的字符摆在一起我人就傻了,也导致了后面一些输出数据非常的奇怪。
4.计算模块接口部分的性能改进
不知道从哪里搞来了一份测试数据有1150条的输入文件,然后备份了一份自己写的代码,将新代码写个循环把数据全部跑一遍,Profile一下:
CallGraph结果:
可由图知大部分时间都消耗在:
正则表达式的匹配和替换函数re.search()和re.sub()
处理地址和匹配地址的函数dealaddress()、matchaddress()
调用Statistics:
调用次数:
我也不知道左边这个该叫啥被调用的次数最多,但是调用总耗时并不大。
耗费时间:
耗时占比比较大的是编译和一些正则表达式的处理函数。
总结一下:通过上面的测试可以发现,这个模块的耗时是编译时间。除去这个部分,主要的时间是花在正则表达式的一些函数上,由于出了正则表达式以外我想不出好的办法去做,所以改进的空间不大就不进行改进了。以上的测试自我感觉代码的性能还可以。
5.计算模块部分单元测试展示
工具:
Coverage
在命令行输入pip install coverage
之后开始测试,输入coverage run test.py
之后查看报告:
看到返回信息的我:
???为什么覆盖率这么低,难道我大部分时间都在白给吗???
结果才发现我指放了一条数据进去测试...于是我陷入了沉思之中...意外之喜:突发奇想的把那个1000+条的样例输入测试文件写一个循环拿去跑一边,结果神奇的发现覆盖率高达100%,让我不禁开始怀疑自己是不是在瞎搞,只输入一条数据覆盖率又很低,让我感觉事情并没有这么简单,但是实在是太懒了搞不懂,就当它是完全覆盖吧。
6.计算模块部分异常处理说明
当写完代码并测试几个数据都很棒棒感觉可以呼吸新鲜空气拥抱大自然的时候,我开始了1000+条数据的测评,以为运行过程中可以放松一下结果一开始就跳异常,不知道为什么在字典中搜索省市的时候会出现返回为空的情况,异常错误KeyError:
百思不得其解,无论怎么改字典,就差没有把字典给删了,还是存在异常,
结果偶然听到大佬说碰到异常就跳过吧,突发奇想的我就加了个try和except,并在捕捉到异常信号的时候跳过continue即可,效果如图:
然后终于测试工具开始自己动了起来,看了看时间,终于可以背着书包准备去吃早饭了。
7.小结一下呗
刚开始看到题目的时候还是在两周到三周之前,看到其他班同学正在苦恼怎么办我的时候,年幼的我在没作业之际内心不由的发出了冷笑,甚至每天过的自由自在,结果一周后我们的作业出来了,眼泪不自主的从眼角滑落,面对着作业中奇奇怪怪的要求,我愣是一个都看不懂,几乎没有经过任何思想斗争,我就选择了用python来写,现在问我为什么我还是不知道,可能是语法比较抽象看的舒服吧...
留下了毫无学术泪水的我开始了强化学习模式:
- 百度快被我访问炸了
- 因为别的班比我们早做一周,在Github疯狂研究他人的代码,
读书人的事情不叫偷! - 夜晚效率直线飙升
- 毫无社交活动,情绪暴躁,容易激动
正经的话:经过一周的精神与肉体折磨,终于完成了第一次个人编程任务,很累但是收获也很多,在被迫接受相关知识的时候,又多了解了很多与该知识点相关的内容,希望今后能一直努力学习,不断进步吧!