有文本文件(约300M),需要统计前N个频率词。第一步是从磁盘读取它,现在我只是使用open.read().lower()
(不区分大小写)是否有更有效的方式来处理 IO 部分?测试机有8核4G内存和Linux系统,python版本为2.6。
问问题
111 次
1 回答
4
是的,在迭代器中逐行处理文件:
with open(filename) as inputfile:
for line in inputfile:
line = line.lower()
这使用缓冲区来提高读取性能,但不会对内存施加太大压力,从而避免了交换。
接下来,使用collections.Counter()
为您进行频率计数。它将以纯 Python 代码中最有效的方式为您处理计数和选择前 N 个单词。
获取单词的一种天真的方法是在空格上分割行。将它与生成器表达式相结合可以在一行代码中为您提供所有字数:
from collections import Counter
with open(filename) as inputfile:
counts = Counter(word for line in inputfile for word in line.lower().split())
for word, frequency in counts.most_common(N):
print '{<40} {}'.format(word, frequency)
该类Counter
是在 Python 2.7 中添加的;对于 2.6,你可以使用这个 backport。
于 2013-08-18T09:00:17.643 回答