一、程序分析
1.讀文件到緩沖區
1 def process_file(dst): # 讀文件到緩沖區 2 try: # 打開文件 3 file1 = open(dst, "r") 4 except IOError as s: 5 print(s) 6 return None 7 try: # 讀文件到緩沖區 8 bvffer = file1.read() 9 except: 10 print("Read File Error!") 11 return None 12 file1.close() 13 return bvffer
2.處理緩沖區 bvffer的文件,統計每個單詞的頻率,存放在字典word_freq
1 def process_buffer(bvffer): 2 if bvffer: 3 word_freq = {} 4 # 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq 5 for i in '!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~': 6 bvffer = bvffer.replace(i, " ") # 替換特殊字符 7 bvffer = bvffer.lower() # 把大寫字母轉換為小寫 8 words = bvffer.split() # 分割字符串 9 for word in words: 10 word_freq[word] = word_freq.get(word, 0)+1 11 return word_freq
3.用輸出函數將處理好的單詞按詞頻排序,輸出詞頻Top10 的單詞
1 def output_result(word_freq): 2 if word_freq: 3 sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True) 4 for item in sorted_word_freq[:10]: # 輸出 Top 10 的單詞 5 print("%-5s %d " % (item[0], item[1]))
4.設立主函數,用於測試
1 def main(): 2 parser = argparse.ArgumentParser() 3 parser.add_argument('dst') 4 args = parser.parse_args() 5 dst = args.dst 6 bvffer = process_file(dst) 7 word_freq = process_buffer(bvffer) 8 output_result(word_freq)
5.用cProfile對代碼性能進行測試
1 if __name__ == "__main__": 2 import cProfile 3 import pstats 4 import argparse 5 cProfile.run("main()", "result") 6 # 直接把分析結果打印到控制台 7 p = pstats.Stats("result") # 創建Stats對象 8 p.sort_stats('calls').print_stats(10) 9 # 按照調用次數排序,打印前10函數的信息 10 p.strip_dirs().sort_stats("cumulative", "name").print_stats(10) 11 p.strip_dirs().sort_stats("cumulative").print_stats() # 按執行時間次數排序 12 p.print_callers(0.5, "process_file") # 得知哪些函數調用了process_file 13 p.print_callers(0.5, "process_buffer") 14 p.print_callers(0.5, "output_result")
二、代碼風格
縮進
使用 4 個空格進行縮進
1 def process_buffer(bvffer): 2 if bvffer: 3 word_freq = {}
空格
在二元運算符兩邊各空一格[=,-,+=,==,>,in,is not, and]
1 bvffer = file1.read()
三、程序運行命令、運行結果截圖
1.對Gone_with_the_wind.txt進行詞頻統計
2.對A_Tale_of_Two_Cities.txt進行詞頻統計
四、性能分析結果及改進
為了更明顯的看出差異,選擇對Gone_with_the_wind.txt進行分析和改進
1.性能分析
(1)總運行時間
(2)執行時間、次數最多的部分代碼
根據數據可以看出,如果除去函數中調用子函數的運行時間,執行次數最多且執行時間最多的代碼是
for word in words: word_freq[word] = word_freq.get(word, 0)+1
2.代碼改進
根據測試結果,最耗時間和次數最多的代碼並不方便修改,我就從耗費時間第二多的replace 以及 split代碼入手,
將原來的代碼:
1 for i in '!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~': 2 bvffer = bvffer.replace(i, " ") # 替換特殊字符 3 bvffer = bvffer.lower() # 把大寫字母轉換為小寫 4 words = bvffer.strip().split() # 分割字符串
變為:
words = bvffer.lower().strip().split()
結果如下:
運行時間:
結果:比之前的0.669快了0.09秒,對於計算計而言已經算是非常漫長的時間了,在實驗過程中我發現當我的電腦處於“繁忙”狀態時,運行的總時間是0.97左右,有時候甚至高於1秒,當我把不用的軟件關掉時,時間就會縮短,可見電腦性能也會影響實驗結果。
四、性能分析結果及改進