有没有比fid.readline()更快的pythonic方法来读取前几行文件?

时间:2017-08-18 13:23:06

标签: python file optimization

我必须打开几千个文件,但只读取前三行。

目前,我这样做:

def test_readline(filename):
    fid = open(filename, 'rb')
    lines = [fid.readline() for i in range(3)]

产生结果:

  

最慢的跑步比最快跑的时间长10.20倍。这可以   表示正在缓存中间结果。 10000循环,最好的   3:每回路59.2μs

另一种解决方案是将fid转换为列表:

def test_list(filename):
    fid = open(filename, 'rb')
    lines = list(fid) 

%timeit test_list(MYFILE)
  

最慢的跑步比最快跑的时间长4.92倍。这可以   表示正在缓存中间结果。 10000循环,最好的   3:每循环374μs

让人惊讶!!是否有更快的方法只读取这些文件的前3行,或者readline()最好?你能回答替代方案和时间吗?

但是在一天结束时,我必须打开数千个单独的文件,它们不会被缓存。因此,它是否重要(看起来像它)?

(603μs未缓存方法读数线与1840μs列表方法)

此外,这里是readlines()方法:

def test_readlines(filename):
    fid = open(filename, 'rb')
    lines = fid.readlines() 
    return lines
  

最慢的跑步比最快跑的时间长7.17倍。这可以   表示正在缓存中间结果。 10000循环,最好的   3:每循环334μs

1 个答案:

答案 0 :(得分:1)

您可以使用itertools.islice

对可迭代进行切片
import itertools


def test_list(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        return list(itertools.islice(f, 3))

(我稍微更改了open,因为按行读取二进制模式的文件有点不寻常,但你可以将其还原。)