有文本文件(大约300M),需要计算前N个频率字。第一步是从磁盘读取它,现在我只是使用open.read().lower()
(不区分大小写)是否有更有效的方法来处理IO部分?测试机有8核4G内存和Linux系统,python版本是2.6。
答案 0 :(得分: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)
在Python 2.7中添加了Counter
类;对于2.6,您可以使用this backport。