软工作业 3:个人编程练习

一、程序分析

1、读文件到缓冲区
def process_file(dst):     # 读文件到缓冲区
try: # 打开文件
doc=open(dst, 'r')
except IOError as s:
print(s)
return None
try: # 读文件到缓冲区
bvffer = doc.read()
except:
print("Read File Error!")
return None
doc.close()
return bvffer

2、处理缓冲区,统计每个单词的频率,存放在字典word_freq
def process_buffer(bvffer):
if bvffer:
word_freq = {} # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
bvffer = bvffer.lower() # 把文本中大写字母转换为小写
for ch in '!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~': # 除去文本中的中英文标点符号并将文本内容改为小写
bvffer = bvffer.replace(ch, " ")
words = bvffer.split() # 分割字符串
for word in words:
word_freq[word] = word_freq.get(word, 0) + 1
return word_freq

3、输出 Top 10 的单词
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("{0:<10}{1:>5}".format(item[0], item[1]))

4、创建一个main函数,进行文本测试
def main():

dst = 'Gone_with_the_wind.txt'
bvffer = process_file(dst)
word_freq = process_buffer(bvffer)
output_result(word_freq)


5、添加进主函数,统计并评估该词频
if __name__ == "__main__":
import cProfile
import pstats
cProfile.run("main()", filename="result.out") # 把分析结果保存到文件中,增加排序方式
p = pstats.Stats('result.out') # 创建Stats对象
p.sort_stats('calls').print_stats(10) # 按照调用次数排序,打印前10函数的信息
p.strip_dirs().sort_stats("cumulative", "name").print_stats(10) # 按照运行时间和函数名排序,只打印前10行函数的信息
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_result()
p.print_callees("process_buffer") # 查看process_buffer()函数中调用了哪些函数


二、代码风格说明
要注意代码格式。学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断。python 最具特色的就是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。
例如:
def main():

dst = 'Gone_with_the_wind.txt'
bvffer = process_file(dst)
word_freq = process_buffer(bvffer)
output_result(word_freq)
如果不对齐会报错。

三、程序运行命令、运行结果截图
Gone_with_the_wind的词频统计运行结果截图如下:

四、性能分析结果及改进

1、总运行时间

2、执行次数最多的

3、执行时间最多的

4、查看哪个函数最耗时并指出其调用最多的方法

扫描二维码关注公众号,回复: 3467079 查看本文章

执行次数最多的方法

2、代码改进

从这次的运行结果来看,调用最多的是get方法,那么我们可以考虑对此动手,所以可以将process_buffer()方法中@#¥%……&*这些之类的符号的代码注释掉。以下是两次时间和调用次数的前后对比图。

对比发现少了0.095s

3、可视化操作

下载转换 dot 的 python 代码gprof2dot 官方下载,下载完了,解压缩,将『gprof2dot.py』 copy 到当前分析文件的路径,或者你系统 PATH 环境变量设置过的路径。

(1) 性能分析:``` python -m cProfile -o result.out -s cumulative word_freq.py Gone_with_the_wind.txt``` ;分析结果保存到 result.out 文件;

(2)转换为图形;gprof2dot 将 result.out 转换为 dot 格式;再由 graphvix 转换为 png 图形格式。 命令:```python gprof2dot.py -f pstats result.out | dot -Tpng -o result.png```

转换得到图如下:

 








猜你喜欢

转载自www.cnblogs.com/houhouquan/p/9751973.html