一、程序分析
(1)將文件讀入緩沖區(dst指文本文件存放路徑,設置成形參,也可以不設,具體到函數里設置)
def process_file(dst): # 讀文件到緩沖區 try: # 打開文件 txt=open(dst,"r") except IOError as s: print s return None try: # 讀文件到緩沖區 bvffer=txt.read() except: print "Read File Error!" return None txt.close() return bvffer
(2)設置緩沖區,將文本度數緩沖區,並對文本的特殊符號進行修改,使其更容易處理,並讀入字典。
def process_buffer(bvffer): if bvffer: word_freq = {} # 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq bvffer=bvffer.lower() for x in '~!@#$%^&*()_+/*-+\][': bvffer=bvffer.replace(x, " ") words=bvffer.strip().split() for word in words: word_freq[word]=word_freq.get(word,0)+1 return word_freq
(3)設置輸出函數,運用lambda函數對詞頻排序,並以“詞”——“頻”格式輸出
def output_result(word_freq): if word_freq: sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True) for item in sorted_word_freq[:10]: # 輸出 Top 10 的單詞 print item
(4)封裝main函數,以便接下來的cProfile的性能評估
def main(): dst = "Gone_with_the_wind.txt" bvffer = process_file(dst) word_freq = process_buffer(bvffer) output_result(word_freq) if __name__ == "__main__": import cProfile import pstats cProfile.run("main()", "result") # 直接把分析結果打印到控制台 p = pstats.Stats("result") # 創建Stats對象 p.strip_dirs().sort_stats("call").print_stats() # 按照調用的次數排序 p.strip_dirs().sort_stats("cumulative").print_stats() # 按執行時間次數排序 p.print_callers(0.5, "process_file") # 如果想知道有哪些函數調用了process_file,小數,表示前百分之幾的函數信息 p.print_callers(0.5, "process_buffer") # 如果想知道有哪些函數調用了process_buffer p.print_callers(0.5, "output_result") # 如果想知道有哪些函數調用了output_res
二、代碼風格說明
縮進
使用4個空格進行縮進
def process_buffer(bvffer): if bvffer: word_freq = {}
行寬
每行代碼盡量不超過80個字符
本次編程最長一行代碼(算上下划線和空格):78個字符
sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
import語句
分行書寫import語句
import cProfile
import pstats
三、程序運行命令、運行結果截圖
詞頻統計結果截圖

四、性能分析結果及改進
執行次數最多:

執行時間最多:

四、性能分析結果及改進
綜合執行次數最多和時間最長,我們可以發現,字典中的get方法是所有話數里用的最多的,要想減少時間,我們可以從替換的符號入手,因為名著《飄》不是一個數學學術性的報告之類的,所以想@#¥%……&*這些之類的符號基本不可能在這本書里出現,所以在規范文本的過程中,我們可以減去對這些符號的替換修改。下面是兩次時間和調用次數的前后對比圖。
for x in '!%()_/-\][': bvffer=bvffer.replace(x, " ")
前:

后:

由此可見快樂大約0.016秒左右。
五、可視化操作
下載gprof2dot.py將此一個PY(無需將一整個文件夾放入)放到詞頻統計的相同目錄,在graphviz官網下載zip文件,解壓,並將其bin目錄添加到系統的環境變量里。
1. 性能分析:python -m cProfile -o result -s cumulative word_freq.py Gone_with_the_wind.txt;分析結果保存到 result 文件;
2. 轉換為圖形;gprof2dot 將 result 轉換為 dot 格式;再由 graphvix 轉換為 png 圖形格式。
命令:python gprof2dot.py -f pstats result | dot -Tpng -o result.png注意:要通過cmd進去詞頻的py程序的目錄,在其中輸入代碼(必須保證已經有了result文件,不然無法找到目標文件)

最后結果分析如下:

