Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高效地读取python中的文本文件_Python_Performance_Performance Testing - Fatal编程技术网

高效地读取python中的文本文件

高效地读取python中的文本文件,python,performance,performance-testing,Python,Performance,Performance Testing,使用python搜索大量文本文件中出现的字符串的“最佳”方法是什么 据我所知,我们可以使用以下方法: for f in files: with open("file.txt") as f: for line in f: # do stuff Python将文件分块缓存在引擎盖下,因此IO惩罚远没有乍一看那么严重。如果我最多只能读几个文件,这就是我的目标 但对于文件列表(或os.walk),我也可以执行以下操作: 如果我有数百个

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

据我所知,我们可以使用以下方法:

for f in files:
    with open("file.txt") as f:
        for line in f:
            # do stuff
Python将文件分块缓存在引擎盖下,因此IO惩罚远没有乍一看那么严重。如果我最多只能读几个文件,这就是我的目标

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


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


我的假设正确吗?或者有更好的方法吗?如果没有明确的答案,那么用python衡量这一点的最佳方法是什么?

这是过早的优化吗

你真的描述了整个过程吗?真的需要加速吗? 见:

<>如果你真的需要加速它,你应该考虑一些线程的方法,因为它是I/O绑定的。< /P> 一种简单的方法是,要使用ThreadPoolExecutor,请参见:

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

正如@Abdul Rahman Ali错误地指出的那样,Regexp并没有更快:

$ 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

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

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)

“但它会提高绩效吗?”这是一个经验问题。你对它进行了分析吗?这取决于许多超出你控制范围的因素——比如文件大小、文件系统和Python缓存、内存大小等等——因此,你最好使用直接的方法,让系统来处理其余的事情。如果您确实需要从您的程序中挤出最后一盎司的性能,那么请使用评测,但我的感觉是,您在尝试优化程序时所浪费的时间将超过您从最佳解决方案中获得的时间。您对其进行了评测吗?它可能不会真的更快!,检查:在这种情况下,每个人都声称regexp的速度较慢,但同样-您需要对其进行分析。如果您指定要提取的单词或使用正则表达式准确查找,则该过程将非常快,无法理解对数据进行多线程操作的逻辑部分,但我看不出它对IO部分有何帮助。你能详细说明一下吗?此外,使用命令行工具也不是通用的解决方案。我想保留它simple@envops-在等待I/O完成时,我们可以搜索字符串,也可以在另一个线程中打开第二个I/O操作。如果从一个磁盘读取,当然读取操作本质上是序列化的。我建议谷歌在堆栈溢出这方面的文献。使用命令行工具并没有什么错-您可以有两个不同的版本-一个用于windows,一个用于linux
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)