此作业的要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145]
该作业git地址为:https://git.coding.net/qiaojingyu/wf_proFile.git
因为本次作业使用的是python语言,所以使用命令行输入以下代码:
python -m cProfile wf.py -s < war_and_peace.txt
得到的运行时间分别如下:
1.第一次运行:

2.第二次运行:

3.第三次运行:

|
次数 |
时间(s) |
|
1 |
0.614 |
|
2 |
0.636 |
|
3 |
0.622 |
|
平均 |
0.624 |
CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz
(1)sorted()函数对词频进行排序时会比较耗时,所以上周已经进行优化。将读入的数据存入两个字典,分两部分排序,最后合并排序。
(2)猜测将读取的文件进行小写转换、字符转换后存入字典这一操作会耗时较长。但是上述操作在词频统计中是必须操作,猜想可以优化标点符号替换操作(将标点符号封装起来)。
# 单词格式化:去掉分词之后部分英文前后附带的标点符号
for word in y:
# last character of each word
word1 = word
# use a list of punctuation marks
while True:
lastchar = word1[-1:]
if lastchar in [",", ".", "!", "?", ";", ‘"‘,"-","*","%"]:
word2 = word1.rstrip(lastchar)
word1 = word2
else:
word2 = word1
break
while True:
firstchar = word2[0:]
if firstchar in [",", ".", "!", "?", ";", ‘"‘,"-","*","%"]:
word3 = word2.lstrip(firstchar)
word2 = word3
else:
word3 = word2
break
# build a wordList of lower case modified words
word_list2.append(word3)
#统计词频
tf = {}
for word in word_list2:
word = word.lower()
# print(word)
word = ‘‘.join(word.split())
if word in tf:
tf[word] += 1
else:
tf[word] = 1
return tf
在命令行输入以下代码:
python -m cProfile -s time wf.py -s < war_and_peace.txt
该命令可以显示出程序中每个函数调用的次数以及运行时间,并对其按时间长短进行排序,看起来比较直观。
得到耗时前三名结果如下图红框内所示:

根据要求1中对程序瓶颈的猜想,优化后的代码如下所示:
while True:
lastchar = word1[-1:]
for lastchar in ‘\r .,"‘:
word2 = word1.rstrip(lastchar)
word1 = word2
else:
word2 = word1
break
while True:
firstchar = word2[0:]
for lastchar in ‘\r .,"‘:
word3 = word2.lstrip(firstchar)
word2 = word3
else:
word3 = word2
break
# build a wordList of lower case modified words
word_list2.append(word3)
再次输入代码:
python -m cProfile -s time wf.py -s < war_and_peace.txt
得到结果如下图所示:
1.第一次运行:

2.第二次运行:

3.第三次运行:

|
次数 |
时间(s) |
|
1 |
0.587 |
|
2 |
0.589 |
|
3 |
0.582 |
|
平均 |
0.586 |
CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz
对比可看出平均运行时间减少了0.038s。
等待教师测评。
原文:https://www.cnblogs.com/qjy0330/p/9748086.html