gpt4 book ai didi

python - 性能:使用 Python 读取文件的最快方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:16 27 4
gpt4 key购买 nike

所以我有大约 400 个文件,大小从 10kb 到 56mb 不等,文件类型为 .txt/.doc(x)/.pdf/.xml,我必须全部阅读。我读入的文件基本上是:

#for txt files
with open("TXT\\" + path, 'r') as content_file:
content = content_file.read().split(' ')

#for doc files using pydoc
contents = '\n'.join([para.text for para in doc.paragraphs]).encode("ascii","ignore").decode("utf-8").split(' ')

#for pdf files using pypdf2
for i in range(0, pdf.getNumPages()):
content += pdf.getPage(i).extractText() + "\n"
content = " ".join(content.replace(u"\xa0", " ").strip().split())
contents = content.encode("ascii","ignore").decode("utf-8").split(' ')

#for xml files using lxml
tree = etree.parse(path)
contents = etree.tostring(tree, encoding='utf8', method='text')
contents = contents.decode("utf-8").split(' ')

但我注意到,即使读取 30 个小于 50kb 的文本文件并对其进行操作也需要 41 秒。但是如果我读取一个 56mb 的文本文件需要 9 秒。所以我猜测是文件 I/O 拖慢了我的速度,而不是我的程序。

关于如何加快这个过程有什么想法吗?也许将每种文件类型分解为 4 个不同的线程?但是你会如何去做呢,因为他们共享同一个列表,并且在完成后该列表将被写入一个文件。

最佳答案

如果您在文件 I/O 上被阻止,正如您所怀疑的那样,您可能无能为力。

但是,如果您有很大的带宽但延迟很严重,那么并行到不同的线程可能会有所帮助。特别是当您正在处理网络文件系统或多盘逻辑驱动器时。所以,尝试一下总没有坏处。

但是没有理由针对每个文件类型执行此操作;只需使用一个池来处理所有文件。例如,使用futures模块:*

import concurrent.futures

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = executor.map(process_file, list_of_filenames)

ThreadPoolExecutor 比基本线程池稍微聪明一些,因为它可以让您构建可组合的 future,但在这里您不需要任何这些,所以我只是将它用作基本线程池线程池,因为 Python 没有其中之一。**

constructor创建 4 个线程,以及管理将任务放到这些线程上并获取结果所需的所有队列和其他任何内容。

然后,map方法只是遍历 list_of_filenames 中的每个文件名,通过对该文件名调用 process_file 创建一个任务,将其提交到池中,然后等待所有任务完成.

换句话说,这与编写相同:

results = [process_file(filename) for filename in list_of_filenames]

…只不过它使用四个线程并行处理文件。

如果这还不够清楚,文档中有一些很好的示例。

<小时/>

* 如果您使用的是 Python 2.x,则需要安装 backport在你可以使用这个之前。或者您可以使用 multiprocessing.dummy.Pool 代替,如下所述。

** 实际上,在 multiprocessing.dummy.Pool 中确实如此,但这没有非常清楚地记录。

关于python - 性能:使用 Python 读取文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27160284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com