Pythonで大きなファイルから,ある要素の個数をカウントするプログラムを書いた.
何も考えずに書いたら結構な時間のかかるバカプログラムになってしまったので,そのメモ
やろうとしたこと:
1行1単語(日本語)のファイルから,全ての単語を出現頻度順に並び替え,その個数も表示する.
100 単語1
90 単語2
・・・
やったこと:
1.とりあえず1単語ずつリストに全部突っ込む
2.重複なしリストをつくる
3.全ての単語について,元のリストから個数を数えてリストをつくる([100,90,…]
4.zipして([単語1,100],[単語2,90]…)個数順にソート
何も考えてないプロセスであるが,これを馬鹿正直に書いたのがこれ
# -*- coding: utf-8 -*- import sys col = [] for line in sys.stdin: col.append(line) uniqList = list(set(col)) num_list = [] for i in range(len(uniqList)): num_list.append( col.count(uniqList[i]) ) lst = sorted(zip(num_list,uniqList), key=lambda x:x[0], reverse=True) for i in range(len(uniqList)): print(str(lst[i][0]) + '\t' + lst[i][1]),
80万行くらいのファイルにかけたら3時間ほどかかった.(Sundy-Bridgeのi5で)
ちょっと遅すぎる(こんだけループ回して数えたら当たり前).
調べてみると,Counterというのがあるらしい.
どうもハッシュで整理しながら高速にカウントしてくれるようだ.
使ってみたのが↓
# -*- coding: utf-8 -*- import sys from collections import Counter col = [] cnt = Counter() for line in sys.stdin: if line.rstrip(): cnt[line.rstrip()] += 1 for key,value in cnt.most_common(100): print key,value
1秒くらいでいけた\(^o^)/
しかも,.most_commonで多い順に表示してくれる.
most_common()で何も入れないと,全てをランキングしてくれる.数字を入れると上位その数字文だけを出力してくれる.
なんて楽(*´∀`)