- 仓库地址
仓库地址
ps:由于st的评测工具要求仓库内只能存放学号.py文件,故我创建了一个学号仓库存放代码,即上面这个仓库地址,然后我又创建了一个仓库,里面有以学号命名的文件夹。
仓库地址
- P2P表格
P2P2.1 | Personal Software process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planing | 计划 | 30 | 60 |
Estimate | 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 120 | 150 |
Analysis | 需求分析(包括学习新技术) | 30 | 30 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 500 | 600 |
Coding | 具体编码 | 700 | 800 |
Code Review | 代码复审 | 300 | 350 |
Test | 测试(自我测试,修改代码,提交修改) | 200 | 200 |
Reporting | 报告 | 100 | 150 |
Test Repor | 测试报告 | 150 | 100 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 50 | 30 |
合计 | 2330 | 2520 |
- 资料
- 解题思路描述
- 拿到题目之后,第一想法是分离姓名、手机号、地址;按照输入格式,分离姓名直接使用python字符串分割.split(','),在分离手机号时,地址中会出现其他数字,这是通过查找博客提取数字找到了正则表达式这个概念,提取出来的数字列表中位数为11的即为手机号,最后是提取地址,在搜索资料时,我发现了CPCA这个库,可以简单的完成四级划分,然后自己再提取关键文字完成五级划分。
- 完成五级划分后,在五级划分的基础上提取关键字实现七级划分。
附加题什么的,tan90°。
- 设计实现过程
- 首先,新建一个函数完成五级划分。
- 其次,设计七级划分函数,类似于五级划分最后一步划分详细地址。
- 最后,实现功能,输入一个字符串后,以“!”分割,然后判断需要五级划分还是七级划分还是附加题类型,分别调用函数,输出json类型规范地址。
- 单元测试
- 单元测试我先使用了王XX的五个样例实现输出,得到以下输出:
随后,我又自己编了几个数据进行了以下测试:
- 使用python自带的coverage库测试代码覆盖率:
由于博客园不支持上传.html文件,于是我只好截图显示coverage report的结果,跟上面的是一样的,只是它会生成一个文件,你会具体看到你的代码哪条是有用到的什么的。
上面这个和下面这个都是运行coverage html -d report之后得到的文件,打开后显示如图。
- 性能分析与改进
- 我使用了python自带的性能分析模块cProfile得到了结果分析,由于cpca第一次要抓取地址,运行时间比较长,调用各种库导致使用的函数也很多。
- 如果单独测试五级地址划分函数,以下是测试结果:
如果单独测试七级地址划分函数,以下是结果:
- 目前使用库虽然抓取时间有点长,但是比较简洁。后续会继续再优化,试试看能不能减少一点运行时间。
- 我再次使用pycharm自带的分析得到一下statistics结果,和cProfile是一样的结果。
发现还是在建立四级联动地址的时候(即cpca库)耗时长 - 继续使用pycharm得到的call gragh得到下面这个图 (他比较大,然后里面的字需要放大才可以看,基本的是这个样子,我转化为了圆形)
放大后看到,主程序耗时11489ms,里面的七级划分,五级划分函数耗时也可以看得到,其他分支就是使用库调用其它函数的耗时
其中,放大后找到一个耗时占比最多的函数,显示也是抓取省/市/区的函数,占比78.8%
- 虽然分析了这么多,但是改进...改进应该要把代码全翻盘了,等我再学习一些知识后再改进,这是目前能做到的最优了。
- 代码说明
ob = ob.split(",") #分割名字
num = re.findall(r"d+",ob) #提取手机号
i=0
while 1 :
if i >= len(num) :
break
elif len(num[i]) == 11 :
break
else:
i = i+1
d["手机"] = num[i]
ob = re.sub(d["手机"],"",ob) #纯地址,将手机号所在位置用""替换
ob = cpca.transform(ob) #划分四级地址
address = np.array(ob)
address = address[3] #查找第四级
i = 0
while 1:
if address[i]=="镇":
d["地址"][3] = address[:(i+1)]
d["地址"][4] = address[(i+1):]
break
elif address[i]=="乡":
d["地址"][3] = address[:(i+1)]
d["地址"][4] = address[(i+1):]
break
elif address[i]=="街" and address[i+1]=="道" :
d["地址"][3] = address[:(i+2)]
d["地址"][4] = address[(i+2):]
break
elif address[i]=="街" :
d["地址"][3] = address[:(i+1)]
d["地址"][4] = address[(i+1):]
break
elif i>=(len(address)-1) :
d["地址"][4] = address
break
else :
i = i+1
- 需要注意的是由cpca.transform后得到市一个dataframe格式的省/市/区/详细地址的划分,需要将它转换为列表,在进行下面的操作。
- 进行详细地址划分的时候我想到的办法就是找关键词进行划分,抓取数据库的话emmmm我的能力有限,之后再学,找到很多数据库都是省市区,先解出来再慢慢优化吧。
- 异常处理
- 第一次使用测试工具时,会出现json格式错误,找了半天没发现哪里有错...最后发现是多输出了一行地址
- 心路历程与收获
- 这次都在找很多资料,提取关键字能搜索出自己想要的内容的能力更强了.....
- 前几天的进度一直如蜗牛一般慢慢前进,快到截止时间了这速度噌噌的就上去了,下次作业还是要慢慢来,不能都堆在最后几天!
- 对python库的调用更熟练了,而且有些参数你传送错误也会得到不是你想要的结果,这时要debug好久;
- 感觉自己很菜,啥都不知道,还在学XX的时候一些人已经很熟练地使用XX了;
- 我现在深深相信且毫不怀疑学完这门课实践能力会进步很多;
- 再次立下flag,下次作业一定要分配好时间,不能堆在快结束的时候做!!!
- 菜是原罪,努力提升自己才是硬道理。