如何在Python中高效地加载大文本文件

3
我有一个包含7000行字符串的文本文件。我需要根据一些参数搜索特定的字符串。
有些人说下面的代码不够高效(速度和内存使用):
f = open("file.txt")
data = f.read().split() # strings as list
  1. 首先,如果不将其列为列表,我该如何开始搜索呢?
  2. 加载整个文件是否高效?如果不是,应该如何处理?
  3. 要筛选任何内容,我们需要搜索它们并正确读取!

有点困惑。


1
只要一次性读取所有内容不超过内存限制,这可能是最快的方式(如果速度是您衡量效率的标准)。 - Joran Beasley
@JoranBeasley 我正在寻找速度和内存效率。一个中间的解决方案会是最好的。 - Dennis Ritchie
1
离题了,Dennis Ritchie 是你的真名吗?使用一个已故人物的名字似乎有些不合适。 - Markus Unterwaditzer
@MarkusUnterwaditzer 我不是丹尼斯·里奇(C语言之父)。 - Dennis Ritchie
你的代码可能存在一个问题,即文件太大而无法适应内存。@Ashwini Chaudhary提供了一种更加内存高效的解决方案。另一方面,我认为在文件上进行迭代不会导致巨大的速度降低。 - Akavall
2
@AshwiniChaudhary的解决方案实际上比一次性加载更节省内存,并且速度更快(根据%timeit结果)(这实际上让我感到惊讶...) - Joran Beasley
1个回答

6
遍���文件的每一行,而不存储它。这将使程序内存更加高效。
with open(filname) as f:
   for line in f:
      if "search_term" in line:
           break

2
这是关于内存使用效率的吗?对吧?但如果你谈论计算速度,一次性加载可能更快?(尽管速度差异可能微不足道)... - Joran Beasley
1
@JoranBeasley 我认为从速度和内存方面考虑,这样做应该可以解决问题,而不是一次性存储整个文件。 - Ashwini Chaudhary
1
@AshwiniChaudhary 哦,你是对的...我这样做是为了没有匹配(强制最坏情况),而且这种方法比一次性加载整个文件快9微秒...让我很惊讶...(这是使用每行1000个字符和7000行的文件) - Joran Beasley
明白了,你的意思。 - Dennis Ritchie
@DennisRitchie 忽略 in 部分,这里的线性搜索将花费 O(n) 的时间,而二分搜索将花费 O(nlogn) 的时间,因为您需要先将整个文件加载到列表中,即一个 O(n) 操作,然后进行二分搜索,需要 logn 的时间。 - Ashwini Chaudhary
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接