Ответ 1
numpy.genfromtxt
принимает итераторы, а также файлы. Это означает, что он примет вывод itertools.islice
. Здесь test.txt
представляет собой пятистрочный файл:
>>> import itertools, numpy
>>> with open('test.txt') as t_in:
... numpy.genfromtxt(itertools.islice(t_in, 3))
...
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[ 11., 12., 13., 14., 15.]])
Можно подумать, что это будет медленнее, чем позволить numpy
обрабатывать файл IO, но быстрый тест предполагает иное. genfromtxt
предоставляет аргумент ключевого слова skip_footer
, который вы можете использовать, если знаете, как долго файл...
>>> numpy.genfromtxt('test.txt', skip_footer=2)
array([[ 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10.],
[ 11., 12., 13., 14., 15.]])
... но несколько неофициальных тестов в 1000-строчном файле предполагают, что использование islice
выполняется быстрее, даже если вы пропустите только несколько строк:
>>> def get(nlines, islice=itertools.islice):
... with open('test.txt') as t_in:
... numpy.genfromtxt(islice(t_in, nlines))
...
>>> %timeit get(3)
1000 loops, best of 3: 338 us per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=997)
100 loops, best of 3: 4.92 ms per loop
>>> %timeit get(300)
100 loops, best of 3: 5.04 ms per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=700)
100 loops, best of 3: 8.48 ms per loop
>>> %timeit get(999)
100 loops, best of 3: 16.2 ms per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=1)
100 loops, best of 3: 16.7 ms per loop