首页 > 解决方案 > 高效读取python中的文本文件

问题描述

使用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 中测量这个的最佳方法是什么?

标签: pythonperformanceperformance-testing

解决方案


那是过早的优化吗?

您是否真的对整个过程进行了剖析,是否真的需要加快速度?见: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

推荐阅读