vulgarian

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  • 仓库地址

仓库地址
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
  • 资料

正则表达式
cpca

  • 解题思路描述

  1. 拿到题目之后,第一想法是分离姓名、手机号、地址;按照输入格式,分离姓名直接使用python字符串分割.split(','),在分离手机号时,地址中会出现其他数字,这是通过查找博客提取数字找到了正则表达式这个概念,提取出来的数字列表中位数为11的即为手机号,最后是提取地址,在搜索资料时,我发现了CPCA这个库,可以简单的完成四级划分,然后自己再提取关键文字完成五级划分。
  2. 完成五级划分后,在五级划分的基础上提取关键字实现七级划分。
  3. 附加题什么的,tan90°。
  • 设计实现过程

  1. 首先,新建一个函数完成五级划分。
  2. 其次,设计七级划分函数,类似于五级划分最后一步划分详细地址。
  3. 最后,实现功能,输入一个字符串后,以“!”分割,然后判断需要五级划分还是七级划分还是附加题类型,分别调用函数,输出json类型规范地址。
  • 单元测试

  1. 单元测试我先使用了王XX的五个样例实现输出,得到以下输出:

    随后,我又自己编了几个数据进行了以下测试:
  2. 使用python自带的coverage库测试代码覆盖率:

    由于博客园不支持上传.html文件,于是我只好截图显示coverage report的结果,跟上面的是一样的,只是它会生成一个文件,你会具体看到你的代码哪条是有用到的什么的。
    上面这个和下面这个都是运行coverage html -d report之后得到的文件,打开后显示如图。
  • 性能分析与改进

  1. 我使用了python自带的性能分析模块cProfile得到了结果分析,由于cpca第一次要抓取地址,运行时间比较长,调用各种库导致使用的函数也很多。
  2. 如果单独测试五级地址划分函数,以下是测试结果:

    如果单独测试七级地址划分函数,以下是结果:
  3. 目前使用库虽然抓取时间有点长,但是比较简洁。后续会继续再优化,试试看能不能减少一点运行时间。
  4. 我再次使用pycharm自带的分析得到一下statistics结果,和cProfile是一样的结果。

    发现还是在建立四级联动地址的时候(即cpca库)耗时长
  5. 继续使用pycharm得到的call gragh得到下面这个图 (他比较大,然后里面的字需要放大才可以看,基本的是这个样子,我转化为了圆形)
    放大后看到,主程序耗时11489ms,里面的七级划分,五级划分函数耗时也可以看得到,其他分支就是使用库调用其它函数的耗时

    其中,放大后找到一个耗时占比最多的函数,显示也是抓取省/市/区的函数,占比78.8%
  6. 虽然分析了这么多,但是改进...改进应该要把代码全翻盘了,等我再学习一些知识后再改进,这是目前能做到的最优了。
  • 代码说明

    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
  1. 需要注意的是由cpca.transform后得到市一个dataframe格式的省/市/区/详细地址的划分,需要将它转换为列表,在进行下面的操作。
  2. 进行详细地址划分的时候我想到的办法就是找关键词进行划分,抓取数据库的话emmmm我的能力有限,之后再学,找到很多数据库都是省市区,先解出来再慢慢优化吧。
  • 异常处理

  1. 第一次使用测试工具时,会出现json格式错误,找了半天没发现哪里有错...最后发现是多输出了一行地址
  • 心路历程与收获

  1. 这次都在找很多资料,提取关键字能搜索出自己想要的内容的能力更强了.....
  2. 前几天的进度一直如蜗牛一般慢慢前进,快到截止时间了这速度噌噌的就上去了,下次作业还是要慢慢来,不能都堆在最后几天!
  3. 对python库的调用更熟练了,而且有些参数你传送错误也会得到不是你想要的结果,这时要debug好久;
  4. 感觉自己很菜,啥都不知道,还在学XX的时候一些人已经很熟练地使用XX了;
  5. 我现在深深相信且毫不怀疑学完这门课实践能力会进步很多;
  6. 再次立下flag,下次作业一定要分配好时间,不能堆在快结束的时候做!!!
  7. 菜是原罪,努力提升自己才是硬道理。
posted on 2019-09-17 19:50  vulgarian  阅读(299)  评论(6编辑  收藏  举报