ファイルの読み込みをちょこっと実験

9月 23rd, 2016

Pythonでのファイルの読み込み&表示で、簡単かつ速い方法があるという話を見かけた。

例えば、text.txtというファイルを読み込んで表示させる場合・・・

for line in open('test.txt'):
    print (line)

ファイル全体を読み込まないのでメモリの節約になる上、簡潔、しかも処理が速い!・・・というわけで、お勧めらしい。

ファイルをクローズしなくていいのかと思ったが、自動的にクローズしてくれるそうな。

ログの表示とかだと特によさげ。あ、でも「\n」に反応するから、なんというか、
aaa
bbb
ccc
というファイルだと一行おきに表示されてる(o_ _)o。まあ、文末「\n」を削除してから表示させればいいんだけど。

ただ、この場合、一行読んでは捨て、一行読んでは捨て、だから、ややっこしい操作には向いていない。読み込んだデータをいじくり回してあっちへやったりこっちへやったりするには、ちょっと無理があるような気がする。

それでも、ひょっとして速いのか??とちょっと試してみた。

1.いつも使っている「with」を使ったファイル読み込み

with open('test.txt',"r") as rfile:
	readlist=rfile.readlines()

2.forを使って読み込みながらデータをリスト化

for line in open('test.txt'):
    readlist.append(line)

1と2をtimeモジュールを使って処理速度を測ってみた。多分精密に計測できる方法はあるのだろうけれど、まあ、大体が分かればいいのでこれでいい、ということで・・・

結果は、読み込むファイルのサイズが小さいうちは、どちらもほとんど変わらない。むしろ「time.time」の動作誤差というのか、パソの機嫌というのか、そちらによる差の方が激しいっぽい(同じファイルに対する同じ処理を何回も繰り返すと毎回結果が変わる。特にファイルサイズが小さいと処理にかかった時間が計測できないくらい小さくなるのか「0.0」表示がよく出た)。

「testtest」という行を1万行くらい作って読み込ませてみたら、さすがに時間差が出始めた。2万行くらいで、大体1の方法が「0.36~0.37」、2の方法だと「0.46~0.48」くらいかかった。

appendでくっつける方が時間がかかるらしい。まあ、当たり前といえば当たり前か・・・

ただ、リスト化するのでなく、単に表示させるだけなら、2のやり方(ただしappendは使わず、ただprintだけする)の方が速くなる。

ちなみに、1の方を普通の表示ではなくリストとしてprintさせる(単にprint(readlist)とする)場合は、1が速い。まあ、表示方法が違うから、比較する方が間違いといえば間違いかもしれないが。

結局、単にファイルの中身を表示させるだけなら2の方法、いろいろ処理がしたければその他の方法、ということになる、かな。

関連記事

  1. 行末の改行記号を落とす(chomp)のが悩ましい
  2. 他のクラスからインスタンス変数って使えるんだね
  3. 同じclass内にあるメソッドを呼び出してみる
  4. Python的漬け物・・・?pickleで散々
  5. pythonで音を鳴らす
  6. pygameでmp3を再生
  7. classの中身は即実行されるらしい
  8. 再生チェックをしても止まらなかった原因が分かった

Comments are closed.