在使用 pandas 的 read_excel 函数读取大型工作簿的多张工作表时,你会发现这个过程会花很长时间。这是因为 pandas 会逐张读取工作表。要想让这个过程更快,可以并行读取这些工作表。让工作簿写入过程并行化很难,但并行读取多张工作表是很容易的。
在 Python 中,如果想充分利用现代计算机都具备的多核处理器,就需要使用标准库中的多线程包。多线程包会生成多个并行执行任务的 Python 解释器(通常一个 CPU 核心一个解释器)。此时不再是逐张处理工作表,而是一个 Python 解释器处理第一张工作表,与此同时另一个 Python 解释器处理第二张工作表,以此类推。
对于包含多个大型工作簿的大型文件的情况,多线程可以显著加快读取过程,不过这是在假定你的系统有足够的内存处理工作负载的情况下。
一 使用 parallel_pandas.py 并行读取工作表
parallel_pandas.py,这是使用 OpenPyXL 并行读取工作表的一种简单实现方式。(里面有两个函数:_read_sheet 和 read_excel)
链接: https://pan.baidu.com/s/1nIBGqVkXFj-fZCBPVWN8eg?pwd=68q2 提取码: 68q2
# 1.py
import parallel_pandas
def main():
a = parallel_pandas.read_excel("xl/stores.xlsx", sheet_name=None)
print(a)
if __name__ == '__main__':
main()
parallel_pandas.read_excel(filename, sheet_name=None):
调用了parallel_pandas
模块中的read_excel
函数。filename
是你要读取的Excel文件的路径。sheet_name=None
表示你想读取Excel文件中的所有工作表。如果你只想读取特定的工作表,可以提供一个工作表名称的列表作为sheet_name
参数的值。
read_excel
函数返回一个字典,其中键是工作表的名称,值是与该工作表对应的pandas.DataFrame
对象。例如,如果你的Excel文件包含名为"Sheet1"和"Sheet2"的两个工作表,函数将返回一个类似于{"Sheet1": df1, "Sheet2": df2}
的字典,其中df1
和df2
分别是这两个工作表对应的DataFrame。
二 两种魔法指令
魔法指令是特定于 Jupyter Notebook 等环境的一种特殊命令,用于提供便捷的功能。它们通常以 %
或 %%
开头。单个 %
前缀的魔法指令应用于单行代码,而双 %%
前缀的魔法指令应用于整个代码单元格。
1.%%time
用途:测量整个代码单元格的执行时间。
真实时间(wall time):从代码开始执行到结束所经过的总时间。这包括了代码运行期间的所有等待时间,比如等待CPU或其他资源。
CPU时间(在macOS或Linux系统上可用):这包括用户模式(user)和系统模式(sys)下的CPU时间,以及总CPU时间。用户模式时间是指CPU在用户程序上花费的时间,而系统模式时间是指CPU在操作系统内核中花费的时间。CPU时间可能比真实时间短(如果CPU资源不足,程序需要等待)或长(如果程序利用多核处理器并行执行)。
2.%%timeit
用途:更准确地测量代码的执行时间。
适用场景:当你需要更精确地了解代码性能时。
3. %%time
和 %%timeit
的区别
%%time
适用于快速查看代码执行的大致时间,而%%timeit
则提供更精确的性能测量,通过多次执行并取平均值来减少误差。
三 体验并行读取 big.xlsx
如果你正在处理Excel文件(无论是较新的.xlsx格式还是旧式的.xls格式),并且你希望加快处理速度,有一种方法是将文件读取和处理过程并行化。
parallel_openpyxl.py:这个脚本实现了使用 OpenPyXL 库并行化读取和处理 .xlsx 格式文件的功能。通过并行化OpenPyXL的使用,你可以绕过Pandas库(Pandas通常用于数据处理,但会先将数据加载到DataFrame中,这可能会成为性能瓶颈),直接从Excel文件中读取和处理数据,从而可能提高速度。
parallel_xlrd.py:这个脚本是针对旧式的.xls格式文件,使用xlrd库实现并行化读取。通过并行化xlrd的使用,你可以直接处理.xls文件中的数据,而不需要先通过Pandas将其转换为DataFrame。
通过并行化读取和处理Excel文件的过程,并直接使用底层的库而不是Pandas,可以提升处理Excel数据的代码的运行速度。
通过直接使用这些底层的库(OpenPyXL和xlrd),你可以避免Pandas在处理大量数据时可能带来的性能开销,因为Pandas在读取Excel文件时,会先将整个文件加载到内存中,形成一个DataFrame对象,这个过程可能会比较耗时。而直接使用OpenPyXL或xlrd,你可以更灵活地处理数据,比如按需读取数据行或列,以及应用必要的清理过程(如去除空白行、转换数据类型等),这些操作都可以并行执行,从而可能显著提高整体处理速度。
四 只需读取单张大型工作表
使用 Modin 并行读取工作表,并行处理单张工作表的读取过程,并实现显著的速度提升。
Modin 需要指定版本的 pandas,安装 Modin 时可能会导致 Anaconda 附带的 pandas 被降级。