python - 高效读取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 中测量这个的最佳方法是什么?
解决方案
那是过早的优化吗?
您是否真的对整个过程进行了剖析,是否真的需要加快速度?见: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
推荐阅读
- rest - 除了互操作性之外,Restful WebService 的优势是什么?
- spring-boot - 为什么不能在 junit 配置中添加程序参数?
- java - 使用 itext 4 编辑 pdf 中的现有超链接
- apache-pig - 当我们使用条件时如何处理展平运算符
- encoding - WebStorm 终端编码/字体问题
- javascript - JS - 在加载其他资源之前设置 Base-Path
- java - 为什么谷歌日历事件 API 不支持 IST 时区?
- r - 带有 Metropolis 主题的 rmarkdown 幻灯片中的字体问题
- codeigniter - 按日期搜索在分页中不起作用
- java - Firestore:查询所有集合 orderBy 和 startsWith 最后 1 个结果