我可能只会使用
itertools.islice。在像文件句柄这样的可迭代对象上使用islice意味着永远不会将整个文件读入内存,并且尽可能快地丢弃前4002行。您甚至可以非常便宜地将所需的两行转换为列表(假设这两行本身不太长)。然后,您可以退出该
with块,关闭文件句柄。
from itertools import islicewith open('afile') as f: lines = list(islice(f, 4003, 4005))do_something_with(lines)更新资料
但是,圣牛的行缓存速度更快,可以进行多次访问。我创建了一个百万行的文件来比较islice和linecache,然后将其删除。
>>> timeit("x=islice(open('afile'), 4003, 4005); print next(x) + next(x)", 'from itertools import islice', number=1)400340040.00028586387634277344>>> timeit("print getline('afile', 4003) + getline('afile', 4004)", 'from linecache import getline', number=1)400240032.193450927734375e-05>>> timeit("getline('afile', 4003) + getline('afile', 4004)", 'from linecache import getline', number=10**5)0.14125394821166992>>> timeit("''.join(islice(open('afile'), 4003, 4005))", 'from itertools import islice', number=10**5)14.732316970825195不断重新导入和重新读取文件:
这不是一个实际的测试,但是即使在每个步骤中重新导入线缓存,也只比islice慢一秒钟。
>>> timeit("from linecache import getline; getline('afile', 4003) + getline('afile', 4004)", number=10**5)15.613967180252075结论
是的,对于所有缓存,linecache的速度都比islice快,但它会不断地重新创建linecache,但是谁来做呢?对于可能的情况(一次仅读取几行,一次读取多行),行缓存速度更快,并且呈现简洁的语法,但是该
islice语法也非常干净快捷,并且永远不会将整个文件读入内存。在RAM密集型环境中,
islice解决方案可能是正确的选择。对于非常高的速度要求,行缓存可能是更好的选择。但是实际上,在大多数环境中,两次时间都足够小,几乎没有关系。



