如何使用python文件对象提高阅读excel文件的速度?



我正在使用python文件对象处理大约2800个excel文件,这需要更多的时间来阅读,因为我的工具需要5个小时来执行,所以我想知道是否有任何方法可以使阅读excel文件的过程更快。

读取文件excel文件代码

import os
path=os.getcwd()
folder=path+"\input"
files = os.listdir(folder)
for file in files:
_input = folder + '\' + file
f=open(_input)
data=f.read()

尝试并行执行每个Excel的处理,看看:

  • 多处理
  • 线程

基本上,您可以做两件事:要么加快每个文件的处理速度,要么同时处理多个文件。最好的解决方案取决于为什么需要这么长时间。您可以从查看每个文件上的处理是否尽可能快开始。

对于并行处理:

如果一个Python程序需要很长时间才能运行,因为它需要等待文件的读写,那么使用线程是有帮助的。这将允许一个线程处理一个文件,而另一个线程正在等待读取或写入其数据。这是否会有帮助取决于许多因素。如果处理本身占了大部分时间,它就没有帮助。如果文件IO占了大部分时间,那么可能会有帮助。如果硬盘已经尽可能快地为多个文件提供服务,那么并行读取多个文件并不会比顺序读取快。本质上,线程(在Python中)只有在计算机在等待CPU完成处理,然后等待硬盘驱动器写入,然后等待硬盘驱动器读取等之间来回切换时才有帮助。这是因为Python中的Global Interpreter Lock

要绕过GIL,我们需要使用多处理,Python实际上启动多个单独的进程。这允许它使用更多的CPU资源,这可以显着提高速度。然而,它并不是免费的。每个进程的启动时间要比每个线程长得多,而且它们不能真正共享太多资源,因此它们将使用更多内存。是否值得取决于手头的任务。

最简单的(在我看来)方式来使用多线程或进程并行是使用concurrent库。假设我们想在每个文件上运行一些函数:

def process_file(file_path):
pass #do stuff

然后我们可以依次运行:

for file_name in some_list_of_files:
process_file(file_name)

…或者通过线程并行:

import concurrent.futures
number_of_threads = 4
with concurrent.futures.ThreadPoolExecutor(number_of_threads) as executor:
for file_name in some_array_of_files:
executor.submit(process_file, file_name)
executor.shutdown()
print("all done!")

或与多处理:

if __name__ == "__main__":
number_of_processes = 4
with concurrent.futures.ThreadPoolExecutor(number_of_processes) as executor:
for file_name in some_array_of_files:
executor.submit(process_file, file_name)
executor.shutdown()
print("All done!")

我们需要if __name__ == "__main__"位,因为我们启动的进程实际上会导入Python文件(但名称不会是"__main__"),所以我们需要阻止它们递归地重做相同的工作。

哪个更快完全取决于需要做的实际工作。有时在主线程中按顺序执行会更快,比如在"normal"中。代码。