1

有文本文件(约300M),需要统计前N个频率词。第一步是从磁盘读取它,现在我只是使用open.read().lower()(不区分大小写)是否有更有效的方式来处理 IO 部分?测试机有8核4G内存和Linux系统,python版本为2.6。

4

1 回答 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 回答