作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/7628
代码git地址 https://e.coding.net/thiking/ci_pin.git
要求0 以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。
运行命令:
ptime wf -s < war_and_peace.txt
运行时间截图:
消耗时间汇总:
CPU参数为:Intel(R)Core(TM)i5-4200M CPU @2.50GHZ 2.49GHZ
要求1 给出你猜测程序的瓶颈。
瓶颈1:处理整个文本内容时遍历整个文档耗时较长
def process_buffer(bvffer): total = 0 if bvffer: word_freq = {} bvffer = bvffer.lower() # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq for ch in '“‘!;,.?”:""': #清除文档中的标点 bvffer = bvffer.lower().replace(ch, " ") #将所有字母转换成小写,并将所有标点转化为空格,便于统计, words = bvffer.strip().split() #strip消除空白符,split以空格作为单词分界 total = total + len(words) print("total: "+str(total)+" words") print('\n') for word in words: word_freq[word] = word_freq.get(word, 0)+1 #读取到的单词存放到字典 Output(word_freq)
瓶颈2:功能四函数过于冗杂
def counoutputText(inputText): # 功能4 文本读入结果重定向至另外文件 filepath = "D://" filename = "output.txt" fullname = filepath + filename standard_output = sys.stdout # 备份默认的标准输出(输出值控制台) sys.stdout = open(fullname, "w+") # 将标准输出重定向至文件 process_buffer(inputText) # 读入文本中 sys.stdout.close() # 关闭文件 sys.stdout = standard_output # 恢复默认标准输出
要求2 通过 profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数(或代码片断)。要求包括截图。 (5分)
使用命令行:python
-
m cProfile
-
s time wf.py
-
s < war_and_peace.txt
运行截图:
其中:
ncalls:表示函数调用的次数;
tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
percall:(第一个percall)等于 tottime/ncalls;
cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;
percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls;
filename:lineno(function):每个函数调用的具体信息;
由测试结果可知:我的程序中最耗时的函数为“process_buffer”(处理文本,统计单词数量),“counoutputText”(重定向输出)以及main函数.
耗时函数的排行为:
1、main函数,函数的耗时为0.900 S
2、counoutputText函数,函数的耗时为0.847 S
3、process_buffer函数,函数的耗时为0.825 S
要求3 根据瓶颈,"尽力而为"地优化程序性能。 (5分)
由于本人水平有限,尝试了好久对程序进行优化,但是始终没有成功,优化之后反而更慢,所以没有对程序做进一步的优化。
要求4 再次 profile,给出在 要求1 中的最花费时间的3个函数此时的花费。要求包括截图。(2分)
由于没有对程序进行优化,所以花费时间仍然和上面保持一样。