1

テキスト ファイル (約 300M) があり、上位 N の頻度の単語をカウントする必要があります。最初のステップは、ディスクから読み取ることです。今は単純にopen.read().lower()(大文字と小文字を区別しない) IO 部分を処理するより効率的な方法はありますか? テスト マシンには 8 コアの 4G メモリと Linux システムがあり、Python のバージョンは 2.6 です。

4

1 に答える 1

4

はい、イテレータでファイルを 1 行ずつ処理します。

with open(filename) as inputfile:
    for line in inputfile:
        line = line.lower()

これは読み取りパフォーマンスのためにバッファを使用しますが、メモリにそれほど負担をかけず、スワップを回避します。

次に、 を使用collections.Counter()して頻度カウントを行います。純粋な Python コードで利用できる最も効率的な方法で、上位 N 語のカウントと選択を処理します。

単語を取得する単純な方法は、空白で行を分割することです。これをジェネレーター式と組み合わせると、1 行のコードですべての単語数を取得できます。

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 に答える