【问题标题】:Reading text files in python efficiently高效读取python中的文本文件
【发布时间】:2020-08-25 08:35:55
【问题描述】:

使用 python 在大量文本文件中搜索字符串出现的“最佳”方法是什么?

据我了解,我们可以使用以下内容:

for f in files:
    with open("file.txt") as f:
        for line in f:
            # do stuff

Python 在后台将文件缓存在块中,因此 IO 损失远没有乍看之下那么严重。如果我最多只能阅读几个文件,这是我的首选。

但对于文件列表(或 os.walk),我也可以执行以下操作:

for f in files:
    with open("file.txt") as f:
        lines = list(f)
    for line in lines:
        #do stuff
    # Or a variation on this

如果我有数百个文件要读取,我想在扫描它们之前将它们全部加载到内存中。这里的逻辑是将文件访问时间保持在最低限度(并让操作系统发挥其文件系统的魔力)并保持逻辑最小化,因为 IO 通常是瓶颈。这显然会消耗更多内存,但它会提高性能吗?

我的假设是否正确和/或有更好的方法来做到这一点?如果没有明确的答案,在 python 中衡量这个的最佳方法是什么?

【问题讨论】:

  • " 但它会提高性能吗?"嗯,这是一个经验问题。你介绍过它吗?
  • 这取决于很多你无法控制的因素——例如文件的大小、文件系统和 Python 缓存、内存大小等——你最好只使用直接的- forward 方法并让系统负责其余的工作。如果您确实需要从程序中榨取最后一点性能,那么请使用分析,但我的感觉是,与从最佳解决方案中获得的收益相比,您将浪费更多时间尝试优化程序。

标签: python performance performance-testing


【解决方案1】:

这是过早的优化吗?

您是否真的对整个过程进行了剖析,是否真的需要加快速度? 见:https://stackify.com/premature-optimization-evil/

如果你真的需要加快速度,你应该考虑一些线程化的方法,因为它是 I/O 绑定的。

一种简单的方法是,要使用 ThreadPoolExecutor,请参阅:https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor

另一种方法(如果您在 linux 上)只是执行一些 shell 命令,如 'find'、'grep' 等 - 这些小 C 程序经过高度优化,肯定是最快的解决方案。您可以使用 Python 来包装这些命令。

正则表达式并不快,正如@Abdul Rahman Ali 所说的错误:

$ python -m timeit '"aaaa" in "bbbaaaaaabbb"'
10000000 loops, best of 3: 0.0767 usec per loop
$ python -m timeit -s 'import re; pattern = re.compile("aaaa")' 'pattern.search("bbbaaaaaabbb")'
1000000 loops, best of 3: 0.356 usec per loop

【讨论】:

  • 我了解对数据进行多线程操作的逻辑部分,但我看不出它对 IO 部分有何帮助。你能详细说明一下吗?同样使用命令行工具也不是通用的解决方案。我想保持简单
  • @envops - 当我们等待 I/O 完成时,我们可以搜索字符串,或者我们可以在另一个线程中打开第二个 I/O 操作。如果您从单个磁盘读取,当然读取操作本质上是序列化的。我建议谷歌搜索有关堆栈溢出的文献。使用命令行工具并没有错 - 你可以有两个不同的版本, - 一个用于 windows,一个用于 linux
【解决方案2】:

在文本中搜索模式的最佳方法是使用正则表达式:

import re
f = open('folder.txt')
list_of_wanted_word=list()
for line in f:
    wanted_word=re.findall('(^[a-z]+)',l)  #find a text in a line and extract it
        for k in wanted_word:#putting the word in a list
            list_of_wanted_word.append(k)
print(list_of_wanted_word)

【讨论】:

  • 你分析过它吗?它可能不会真的更快!,检查:stackoverflow.com/questions/19911508/… 每个人都声称在这种情况下正则表达式较慢,但同样 - 你需要对其进行分析。
  • 如果指定要提取的词或使用正则表达式准确查找,过程会非常快
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2017-04-19
相关资源
最近更新 更多