小さな10ラインのテストファイルで、私は2つのアプローチを試してみました - 全体を解析し、最後のN行を選択し、対すべての行を読み込むが、唯一の解析最後のNは:
In [1025]: timeit np.genfromtxt('stack38704949.txt',delimiter=',')[-5:]
1000 loops, best of 3: 741 µs per loop
In [1026]: %%timeit
...: with open('stack38704949.txt','rb') as f:
...: lines = f.readlines()
...: np.genfromtxt(lines[-5:],delimiter=',')
1000 loops, best of 3: 378 µs per loop
これはEfficiently Read last 'n' rows of CSV into DataFrameの複製としてタグ付けされました。ここで受け入れられた答えは、
from collections import deque
を使用し、その構造の最後のN行を収集しました。また、不要な合併症であるため、パーサに行を供給するためにStringIO
を使用しました。 genfromtxt
は、それに行を与えるものから何かを入力するので、行のリストはうまくいきます。
In [1031]: %%timeit
...: with open('stack38704949.txt','rb') as f:
...: lines = deque(f,5)
...: np.genfromtxt(lines,delimiter=',')
1000 loops, best of 3: 382 µs per loop
readlines
とスライスと基本的に同じ時刻です。
deque
は、ファイルが非常に大きい場合に利点があり、すべての行にハングアップするコストがかかります。私はそれがファイルの読み込み時間を節約するとは思わない。まだ線を1つずつ読む必要があります。
row_count
のタイミングに続いてskip_header
のタイミングが遅くなります。ファイルを2回読み取る必要があります。 skip_header
はまだ行を読み取る必要があります。カウントラインの目的のために
In [1046]: %%timeit
...: with open('stack38704949.txt',"r") as f:
...: ...: reader = csv.reader(f,delimiter = ",")
...: ...: data = list(reader)
...: ...: row_count = len(data)
...: np.genfromtxt('stack38704949.txt',skip_header=row_count-5,delimiter=',')
The slowest run took 5.96 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 760 µs per loop
多くの余分な時間を要するように見えませんが、我々は、csv.reader
を使用する必要はありません。
In [1048]: %%timeit
...: with open('stack38704949.txt',"r") as f:
...: lines=f.readlines()
...: row_count = len(data)
...: np.genfromtxt('stack38704949.txt',skip_header=row_count-5,delimiter=',')
1000 loops, best of 3: 736 µs per loop