一、程序分析
(1)將文件讀入緩沖區(dst指文本文件存放路徑,設置成形參,也可以不設,具體到函數里設置)
def process_file(dst): # 讀文件到緩沖區try: # 打開文件
txt=open(dst,"r")
except IOErrorass:
print sreturnNonetry: # 讀文件到緩沖區
bvffer=txt.read()
except:
print"Read File Error!"
returnNone
txt.close()return bvffer
(2)設置緩沖區,將文本度數緩沖區,并對文本的特殊符號進行修改,使其更容易處理,并讀入字典。
def process_buffer(bvffer):ifbvffer:
word_freq={}
# 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq
bvffer=bvffer.lower()for x in '~!@#$%^&*()_+/*-+\][':
bvffer=bvffer.replace(x, " ")
words=bvffer.strip().split()for word inwords:
word_freq[word]=word_freq.get(word,0)+1
return word_freq
(3)設置輸出函數,運用lambda函數對詞頻排序,并以“詞”——“頻”格式輸出
def output_result(word_freq):ifword_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):ifbvffer:
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文件,不然無法找到目標文件)
最后結果分析如下: