此作业要求参见: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(" ") # 输出键值对 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(" ") # 输出键值对 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分)