代码改变世界

康哲 20190919-3 效能分析

2019-09-23 12:38  康哲  阅读(182)  评论(0编辑  收藏  举报

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

git链接:https://e.coding.net/kangzhe/wf.git

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

连续三次运行效果如下:

第一次运行:

 CPU参数:Intel(R)Core(TM)i5-8300H CPU @ 2.30GHz 2.30 GHz

第一次运行时间:0.685s

第二次运行:

CPU参数:Intel(R)Core(TM)i5-8300H CPU @ 2.30GHz 2.30 GHz

第二次运行时间:0.492s

第三次运行:

CPU参数:Intel(R)Core(TM)i5-8300H CPU @ 2.30GHz 2.30 GHz

第二次运行时间:0.512s

 要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化 (或考虑到优化,因此更差的代码没有写出) 。

代码片段:

def test_four(redirect_words):
    total = 0
    words = re.findall(r'[a-z0-9^-]+', redirect_words.lower())
    counts = collections.Counter(words)
    total += len(words)
    # 计算相同单词的数量
    for key, value in counts.most_common():
        if counts[key] > 1:
            total = total - counts[key] + 1
    print("total", total)
    print("\n")
    # 输出键值对
    for key, value in counts.most_common(10):
        print(key, value)

瓶颈:对文档进行正则化时,可能会相对消耗时间,在计算单词数时需要对单词列表进行遍历,同时在输出单词和统计字数时又对列表进行了遍历,这两处相对的消耗时间。

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

运行截图如下:

其中最好费时间的函数是:test_four,findall和collections,Counter函数。时间分别为0.257s,0.150s,0.50s,通过以上运行截图中数据来看,瓶颈处于第四个功能的遍历文件查找单词上。

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

修改前代码:

def test_four(redirect_words):
    total = 0
    words = re.findall(r'[a-z0-9^-]+', redirect_words.lower())
    counts = collections.Counter(words)
    total += len(words)
    # 计算相同单词的数量
    for key, value in counts.most_common():
        if counts[key] > 1:
            total = total - counts[key] + 1
    print("total", total)
    print("\n")
    # 输出键值对
    for key, value in counts.most_common(10):
        print(key, value)

修改后代码:

def test_four(redirect_words):
    words = re.findall(r'[a-z0-9^-]+', redirect_words.lower())
    count(words)

改进:将功能四中的大部分代码都装进一个函数中,在功能四读取完单词后计数交到了另一个函数中执行,降低了功能4执行的时间,也增加了读取文本内容的效率。

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

 

 在要求一中的三个函数test_four,findall和collections,Counter函数执行时间分别为:0.230,0.145,0.50。在代码中将功能四的代码装在了一个可调用的函数中,能尽量降低查找单词和功能四的执行效率。

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