一个问题是,一个in
测试一个list
是慢的。你可能应该保留一个set
记录您所看到的单词,因为in
测试一个set
速度非常快。
Example:
report_set = set()
for line in report:
for word in line.split():
if we_want_to_keep_word(word):
report_set.add(word)
然后当你完成后:
报告列表 = 列表(报告集)
任何时候你需要强制set
into a list
, 你可以。但如果你只需要循环它或做in
测试,您可以将其保留为set
;这是合法的for x in report_set:
另一个可能重要也可能不重要的问题是,您使用以下命令一次性从文件中读取所有行:.readlines()
方法。对于非常大的文件,最好只使用打开的文件句柄对象作为迭代器,如下所示:
with open("filename", "r") as f:
for line in f:
... # process each line here
一个大问题是我什至不知道这段代码是如何工作的:
while 1:
lines = report.readlines()
if not lines:
break
这将永远循环。第一个语句用以下命令吸食所有输入行.readlines()
,然后我们再次循环,然后下一次调用.readlines()
has report
已经筋疲力尽了,所以打电话给.readlines()
返回一个空列表,从而跳出无限循环。但是现在我们刚刚读到的所有行都丢失了,其余的代码必须用一个空的lines
多变的。这是如何运作的?
所以,摆脱整个while 1
循环,并将下一个循环更改为for line in report:
.
另外,你真的不需要保留count
多变的。您可以使用len(report_set)
随时查出有多少个单词set
.
另外,还带有一个set
你实际上不需要检查一个单词是否是in
集合;你可以随时打电话report_set.add(word)
如果它已经在set
不会再添加了!
另外,你不have按照我的方式来做,但我喜欢制作一个可以完成所有处理的生成器。剥离行、翻译行、按空格分割,然后生成可供使用的单词。我也会强制这些词小写,除非我不知道这是否重要FOOTNOTES
仅以大写形式检测。
因此,将以上所有内容放在一起,您将得到:
def words(file_object):
for line in file_object:
line = line.strip().translate(None, string.punctuation)
for word in line.split():
yield word
report_set = set()
with open(fullpath, 'r') as report:
for word in words(report):
if word == "FOOTNOTES":
break
word = word.lower()
if len(word) > 2 and word not in dict_file:
report_set.add(word)
print("Words in report_set: %d" % len(report_set))