课后作业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。

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字符串

  • 将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的单词

运行结果
  • 大文件:Gone_with_the_wind.txt

python word_freq.py Gone_with_the_wind.txt

1628833-20190330215343230-1162303221.png

  • 小文件:A_Tale_of_Two_Cities.txt

python word_freq.py A_Tale_of_Two_Cities.txt

1628833-20190330215405098-1789628705.png

 3.简单性能分析并改进、提交代码

python -m cProfile word_freq.py Gone_with_the_wind.txt

1628833-20190330215423195-352541608.png

总共有442597次函数调用,程序总共耗时0.464秒

1628833-20190330215439192-1386217442.png

其中process_buffer占用了,0.408秒

1628833-20190330215453758-541659278.png

执行次数最多的是strip函数

问题
  1. word_freq[item.strip()] = 0的strip多余,之前已经通过正则,去掉了空白字符
  2. 在process_buffer函数中,建立word_list字典使用了两次for循环
改进
  1. 去掉strip()函数

    1628833-20190330215508839-1693784043.png

  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

1628833-20190330215522985-1070807696.png

总结

  • 通过这次的词频统计案例,复习了python的文件读写,字符串处理等操作。
  • 更加深入地学习使用了git

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

转载于:https://www.cnblogs.com/wenshaotian/p/10629218.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值