1. 程式人生 > >第三次作業——效能分析

第三次作業——效能分析

分享圖片 urn ali spl cnblogs ctu 轉換 top 代碼

此作業的要求參見:[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:程序運行時間。

等待教師測評。

第三次作業——效能分析