gpt4 book ai didi

Python最快访问大文件中的第n行

转载 作者:太空狗 更新时间:2023-10-29 17:03:31 25 4
gpt4 key购买 nike

我在文件中有一个 ASCII 表,我想从中读取一组特定的行(例如行 4003 到 4005)。问题是该文件可能非常非常长(例如,从数千行到数百万行),我想尽快完成此操作。

a) 错误的解决方案:读入整个文件,然后转到那些行,

f = open('filename')
lines = f.readlines()[4003:4005]

b) 更好的解决方案:枚举每一行,这样它就不会全部在内存中(a la https://stackoverflow.com/a/2081880/230468)

f = open('filename')
lines = []
for i, line in enumerate(f):
if i >= 4003 and i <= 4005: lines.append(line)
if i > 4005: break # @Wooble

c) 最佳解决方案?

但是 b) 仍然需要遍历每一行。

是否有更好的(在速度/效率方面)从大文件访问特定行的方法?

  • 我应该使用 linecache 吗?即使我只会访问文件一次(通常)?
  • 改用二进制文件,在这种情况下可能更容易跳过,是一种选择 --- 但我宁愿避免它。

最佳答案

我可能只使用 itertools.islice .在像文件句柄这样的可迭代对象上使用 islice 意味着永远不会将整个文件读入内存,并且会尽快丢弃前 4002 行。您甚至可以非常便宜地将所需的两行放入列表中(假设行本身不是很长)。然后您可以退出 with block ,关闭文件句柄。

from itertools import islice
with open('afile') as f:
lines = list(islice(f, 4003, 4005))
do_something_with(lines)

更新

但圣牛是多访问更快的行缓存。我创建了一个百万行的文件来比较 islice 和 linecache,而 linecache 把它吹走了。

>>> timeit("x=islice(open('afile'), 4003, 4005); print next(x) + next(x)", 'from itertools import islice', number=1)
4003
4004

0.00028586387634277344
>>> timeit("print getline('afile', 4003) + getline('afile', 4004)", 'from linecache import getline', number=1)
4002
4003

2.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

不断重新导入和重新读取文件:

这不是实际测试,但即使在每一步重新导入 linecache 也只比 islice 慢一秒。

>>> timeit("from linecache import getline; getline('afile', 4003) + getline('afile', 4004)", number=10**5)
15.613967180252075

结论

是的,linecache 在所有方面都比 islice 快,但不断地重新创建 linecache,但谁会这样做呢?对于可能的场景(一次只读取几行,一次读取多行),linecache 更快并且呈现简洁的语法,但是 islice 语法也非常干净和快速并且不会永远不要将整个文件读入内存。在 RAM-tight 环境中,islice 解决方案可能是正确的选择。对于非常高的速度要求,linecache 可能是更好的选择。但实际上,在大多数环境中,这两个时间都足够小,几乎无关紧要。

关于Python最快访问大文件中的第n行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com