第三次作业——效能分析

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

该作业git地址为:https://git.coding.net/qiaojingyu/wf_proFile.git

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

因为本次作业使用的是python语言,所以使用命令行输入以下代码:

python -m cProfile wf.py -s < war_and_peace.txt

得到的运行时间分别如下:

1.第一次运行:

2.第二次运行:

3.第三次运行:

次数

时间(s

1

0.614

2

0.636

3

0.622

平均

0.624

CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz

 

 

 要求1:要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化。

(1)sorted()函数对词频进行排序时会比较耗时,所以上周已经进行优化。将读入的数据存入两个字典,分两部分排序,最后合并排序。

(2)猜测将读取的文件进行小写转换、字符转换后存入字典这一操作会耗时较长。但是上述操作在词频统计中是必须操作,猜想可以优化标点符号替换操作(将标点符号封装起来)。

        # 单词格式化:去掉分词之后部分英文前后附带的标点符号
        for word in y:
            # last character of each word
            word1 = word

            # use a list of punctuation marks
            while True:
                lastchar = word1[-1:]
                if lastchar in [",", ".", "!", "?", ";", '"',"-","*","%"]:
                    word2 = word1.rstrip(lastchar)
                    word1 = word2
                else:
                    word2 = word1
                    break

            while True:
                firstchar = word2[0:]
                if firstchar in [",", ".", "!", "?", ";", '"',"-","*","%"]:
                    word3 = word2.lstrip(firstchar)
                    word2 = word3
                else:
                    word3 = word2
                    break
                    # build a wordList of lower case modified words
            word_list2.append(word3)
          
        #统计词频
        tf = {}
        for word in word_list2:
            word = word.lower()
                # print(word)
            word = ''.join(word.split())
            if word in tf:
                tf[word] += 1
            else:
                tf[word] = 1
        return tf

  

要求2:通过profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数或代码片段。

在命令行输入以下代码:

python -m cProfile -s time wf.py -s < war_and_peace.txt

该命令可以显示出程序中每个函数调用的次数以及运行时间,并对其按时间长短进行排序,看起来比较直观。

得到耗时前三名结果如下图红框内所示:

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

根据要求1中对程序瓶颈的猜想,优化后的代码如下所示:

 while True:
                lastchar = word1[-1:]
                for lastchar in '\r .,"':
                    word2 = word1.rstrip(lastchar)
                    word1 = word2
                else:
                    word2 = word1
                    break

            while True:
                firstchar = word2[0:]
                for lastchar in '\r .,"':
                    word3 = word2.lstrip(firstchar)
                    word2 = word3
                else:
                    word3 = word2
                    break
                    # build a wordList of lower case modified words
            word_list2.append(word3)

  

要求4:再次profile,给出在要求1 中的最花费时间的3个函数此时的花费。

再次输入代码:

python -m cProfile -s time wf.py -s < war_and_peace.txt

得到结果如下图所示:

1.第一次运行:

 

2.第二次运行:

3.第三次运行:

次数

时间(s

1

0.587

2

0.589

3

0.582

平均

0.586

CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz

对比可看出平均运行时间减少了0.038s。

要求5:程序运行时间。

等待教师测评。

猜你喜欢

转载自www.cnblogs.com/qjy0330/p/9748086.html
今日推荐