2010年12月7日火曜日

pythonで一行ごとにファイルを読む

Pythonで一行ごとにファイルを読むとき
for l in sys.stdin:
  print l 
だと改行が含まれてしまうので、改行を落としたいことが良くあります。

いままで、
for l in sys.stdin:
    print l.rstrip()
などとやっていたのですが(1)、なんか美しくないので考えてみました。


数秒考えた結果、ジェネレータを使うのが良さそうな感じがしました。(2)
for l in (x.rstrip() for x in sys.stdin):
    print l


このような場合リスト内包は向きません。(3)
for l in [x.rstrip() for x in sys.stdin]:
    print l


あんまり遅くなってしまっては仕方ないので、この3パターンを比較してみました。
(/usr/bin/timeを使用。手元にあった一番大きいテキストファイルはmecab-ipadicのmatrix.def(1731857行)だったのでそれを使用した)
方法usersyselapsedmaxresidentpagefaults
(1)1.450.011.4813434946
(2)1.610.011.6313450947
(3)1.750.051.8231959120141

こうみると、多少遅くなってるけど、まあ許容できるかなといった感じでした。メモリ使用量はほとんど増えていません。

0 件のコメント:

コメントを投稿