課後做業3:我的項目(詞頻統計及其效能分析)

1.我的信息

  • 學號:2017XXXXX7242
  • 姓名:聞紹天
  • 詞頻統計及其效能分析倉庫:倉庫地址

2.程序分析

def process_file(dst):
    # 讀文件到緩衝區
    try:
        # 打開文件
        f = open(dst, 'r')
    except IOError as s:
        print(s)
        return None
    try:
        # 讀文件到緩衝區
        bvffer = f.read()
    except:
        print("Read File Error!")
        return None

    f.close()

    return bvffer

process_file函數的做用是,經過傳入dst參數,dst是文件的名稱+後綴名,經過文件打開,讀取,最終返回dst文件的字符串形式bvffer。python

def process_buffer(bvffer):
    if bvffer:
        word_freq = {}
        # 下面添加處理緩衝區 bvffer代碼,統計每一個單詞的頻率,存放在字典word_freq

        # 全變小寫,解決大小寫單詞不一樣問題
        bvffer = bvffer.lower()
        # 把除了小寫字母和空白字符,的其餘字符,替換成空字符
        bvffer = re.sub('[^a-z \s]', '', bvffer)
        # 把空白字符都換成空格
        bvffer = re.sub('\s', ' ', bvffer)

        # 經過切空格把每一個單詞分開成一個list
        word_list = bvffer.split(' ')

        # 經過循環,將單詞做爲key存到word_list字典中,並將value初始值設爲0
        for item in word_list:
            if not item:
                continue
            word_freq[item.strip()] = 0

        # 經過循環,判斷是否在字典中,若在字典中,value+1
        for item in word_list:
            if not item:
                continue
            word_freq[item] = word_freq[item] + 1
        return word_freq
  • process_buffer函數傳入的參數是process_file函數返回的bvffer字符串git

  • 將bvffer字符串進行,小寫,去除除了小寫字母和空白字符的其餘字符,把空白字符換成空格函數

  • 以空格分隔,使用split(),經過循環把單詞和出現次數放到字典word_freq中性能

  • 返回word_freq字典學習

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)

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('dst')
    args = parser.parse_args()
    dst = args.dst
    bvffer = process_file(dst)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

output_result函數傳入上面的字典word_freq參數,輸出詞頻前10的單詞spa

運行結果

  • 大文件:Gone_with_the_wind.txt

python word_freq.py Gone_with_the_wind.txt3d

  • 小文件:A_Tale_of_Two_Cities.txt

python word_freq.py A_Tale_of_Two_Cities.txtcode

### 3.簡單性能分析並改進、提交代碼blog

python -m cProfile word_freq.py Gone_with_the_wind.txtip

總共有442597次函數調用,程序總共耗時0.464秒

其中process_buffer佔用了,0.408秒

執行次數最多的是strip函數

問題

  1. word_freq[item.strip()] = 0的strip多餘,以前已經經過正則,去掉了空白字符
  2. 在process_buffer函數中,創建word_list字典使用了兩次for循環

改進

  1. 去掉strip()函數

  2. 改爲一個for循環

for item in word_list:
    if not item:
        continue
    if item in word_freq:
        word_freq[item] = word_freq[item] + 1
    else:
        word_freq[item] = 1

總結

  • 經過此次的詞頻統計案例,複習了python的文件讀寫,字符串處理等操做。

  • 更加深刻地學習使用了git

  • 熟悉了效能分析的基本流程和方法

相關文章
相關標籤/搜索