Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有比fid.readline()更快的pythonic方法来读取文件的前几行?_Python_File_Optimization - Fatal编程技术网

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

有没有比fid.readline()更快的pythonic方法来读取文件的前几行?,python,file,optimization,Python,File,Optimization,我必须打开几千个文件,但只读前3行 目前,我正在这样做: 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): f

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

目前,我正在这样做:

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()方法:

最慢的跑步比最快的跑长7.17倍。这可能 表示正在缓存中间结果。10000圈,最好的 3:334µs/回路


您可以使用以下方法切片iterable:


(我把
打开的
调高了一点,因为以二进制模式逐行读取文件有点不寻常,但您可以将其还原。)

1000个文件的600µs仍然只有0.6秒。我想,操作1000个文件还不错。“更快”是可以的,但在什么情况下它太慢了?您需要多长时间执行一次此操作?需要多快?如果您知道前三行永远不会超过某个大小,并且您可以进行过冲,
.readlines()
还接受一个具有最大读取字节数或字符数的参数。不过,在大多数情况下都有点奇怪。每个文件有.600µs。所以它确实是“加起来的”。我在代码后面做了很多其他的事情。每一点都有帮助,并试图优化。@Ryan你应该添加答案而不是评论,我可以计时。但从我对readlines()的了解来看,它会先读取整个文件。@evanleeturner:这取决于你没有回答的问题。前三行有硬尺寸限制吗?为了工作,我不得不稍微修改一下。当我在我的文件上运行时,因为它们是二进制的,所以我删除了encoding=并添加回“rb”。在timeit上,最慢的跑步比最快的跑长35.51倍。这可能意味着正在缓存中间结果。10000个循环,每个循环最好3个:53.6µs我已经运行了多次timeit:~824µs是总的非缓存时间,因此仍然不比readline快最慢的运行比最快的运行时间长15.32倍。这可能意味着正在缓存中间结果。10000个回路,最佳3个:53.8µs/sloop@evanleeturner:是的,这个答案更像蟒蛇。它的速度将与多个
.readline()
调用的速度相同,而且不会比这快多少。
def test_readlines(filename):
    fid = open(filename, 'rb')
    lines = fid.readlines() 
    return lines
import itertools


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