csv
Python の非常に貴重なモジュールを使用して、大きな csv ファイル (400 万行以上) を読み込んでいます。さまざまなアプローチのタイミングを計る中で、直感的でない結果に出くわしました。
次のスクリプトを実行すると、約11 ~ 12 秒かかります。 b
の後、ほぼ瞬時に作成されa
ます。
r = csv.reader(open("data.csv", "rb"), delimiter=";")
a = [None for row in r]
b = [row for row in r]
しかし、まったく作成しない同様のスクリプトを実行するとa
、コードに時間がかかります( 21-22秒)。
r = csv.reader(open("data.csv", "rb"), delimiter=";")
b = [row for row in r]
b
が作成された後、 の作成にほとんど時間がかからない理由が理解できa
ます。しかし、私は (素朴に) のみb
が作成され、 が作成されない2 番目のコード ブロックa
の方が高速なスクリプトになると考えていました。非 Pythonic のように見えるリスクがありますが、作成する理由を誰かが説明できるかどうかを知りたいと思っています。a
b
b
さらに、この速度向上がより複雑な操作で一貫している場合、(スタイル/読みやすさの問題以外に)それを利用しない正当な理由はありますか? 聞いたことのない従来の方法で同じ時間の節約をすでに達成しているよりも、Python プログラマーの方が精通しているでしょうか?
a
たとえば、の代わりに整数を使用して構築するとNone
、同じ結果が得られます。csv.reader
オブジェクトを反復処理するのではなく、 を反復処理する場合、open("data.csv", "rb").readlines()
タイミングは予想どおりb
です。したがって、時間のずれはおそらく、オブジェクトのプロパティ、またはそのようなオブジェクトのより一般的なクラスのプロパティと関係があります。より前に作成した場合、時間は 1 人で作成した場合とほぼ同じです。 a
b
csv.reader
b
a
b
いくつかのメモ:
b
前に作成すると、単独でa
作成するのと同じ時間がかかります。b
- これらを対話モードで行ごとに実行していません。それぞれを個別のスクリプトとして実行しています。
- と同じ長さのものでいっぱいの
r
リスト、または の行のリストを実際に作成しようとしているわけではありませんr
。 - 念のために言うと、私は 64 ビット Windows 7 で Enthought Python ディストリビューション 7.3-2 を使用して Python 2.7.3 を実行しています。