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