此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/7628]

要求0 以《战争与和平》作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数

测试方法:输入ptime wf -s < war_and_peace.txt

第一次测试时间截图:

第二次测试时间截图:

第三次测试时间截图:

统计表:

要求1 给出你猜测程序的瓶颈。

瓶颈1:

           readinput=sys.stdin.read()
           

读入文本所占时间较长

瓶颈2

    lists=findall(r'[a-z0-9^-]+',input.lower())
    words=Counter(lists)

通过正则表达式生成单词列表和统计单词个数花费较长时间

要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图

方法:输入python -m cProfile -s time wf.py -s < war_and_peace.txt

最耗费时间的3个函数:

要求3 要求4根据瓶颈,"尽力而为"地优化程序性能。

这三个函数是该功能实现的关键,暂还未找到更好的替代函数,无法直接对这三个瓶颈进行优化。所以在此要求下,我做了两个实验。

实验1:封装函数

原代码

def doinput(input):
    lists=findall(r'[a-z0-9^-]+',input.lower())
    words=Counter(lists)
    num=0
    for key,value in words.items():
        num+=1
    print('total'+' '+str(num))
    maxwords=words.most_common(10)
    for i in maxwords:
        print('%-8s%5d'%(i[0],i[1]))

现代码

 

def tongji(list):
    words=Counter(list)
    num=0
    for key,value in words.items():
        num+=1
    print('total'+' '+str(num))
    maxwords=words.most_common(10)
    for i in maxwords:
        print('%-8s%5d'%(i[0],i[1]))
def doinput(input):
    lists=findall(r'[a-z0-9^-]+',input.lower())
    tongji(lists)
    

再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图

 修改后的三次测试时间:

 

 结论:与原来相比,封装函数后,三个耗费时间最长的函数运行时间有所下降,平均运行时间也有所下降。

实验2:在实验1的基础上,改变遍历字典的方式

原代码:

    for key,value in words.items():
        num+=1

现代码:

    for i in words:
        num+=1

再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图

 

 

 修改后的三次测试时间:

 

 

 

 结论:与实验1结果相比,改变字典遍历方式后,counter()运行时间有所下降,findall()和read()运行时间有所上升,平均运行时间有所下降。

要求5 程序运行时间。根据在教师的机器 (Windows8.1) 上运行的速度排名,分为3档。此题得分,第1档20分, 第2档10分,第3档5分。功能测试不能通过的,0分。

供老师测试的git地址为[https://e.coding.net/sxl357/wf.git]

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-09-22 17:58  simpleli  阅读(152)  评论(2编辑  收藏  举报