0

約 30 個のファイルがあり、それぞれのサイズは約 300MB です。ユーザー名など、各ファイルに興味のある情報がいくつかあります。今、正規表現を使用してユーザー名を見つけ、次に最も一般的なユーザー名を見つけたいと思います。これが私のコードです:

rList=[]
for files in os.listdir("."):
    with open(files,'r') as f:
        for line in f:
            m=re.search('PATTERN TO FIND USERNAME',line)
            if m:
                rList.append(m.group())             
c=Counter(rList)
print c.most_common(10)

ご覧のとおり、見つけたすべてのユーザー名をリストに追加してから、Counter() を呼び出します。この方法では、完了するまでに約数分かかります。ファイルの読み取りが完了するたびに を削除しc=Counter(rList)て呼び出してみましc.update()たが、違いはありませんか?

SO、これはベストプラクティスですか?パフォーマンスを向上させる方法はありますか? ありがとう!

4

2 に答える 2

1

プロファイリングを行うと、ファイルの各行を 1 つずつループすることに関連して、かなりのオーバーヘッドがあることがわかります。ファイルが常に指定したサイズに近く、メモリを消費できる場合は、 を 1 回呼び出すだけでファイルをメモリに取得し.read()、より複雑なプリコンパイル済み正規表現 (改行を考慮) を使用してすべてのユーザー名を抽出します。すぐに。次に.update()、一致した正規表現からのグループを持つカウンターオブジェクト。これは、可能な限り効率的です。

于 2013-09-08T15:21:26.383 に答える