赞
踩
搭了一个配置表检查平台,单个项目使用时执行效率还能接受,可后面部署到公司所有项目使用时执行就变的慢,毕竟数据量起来了,经过排查主要表现在表格的读取,所有才有这篇效率对比。
CSV标准库自带,不用安装
pip install openpyxl
pip install xrld
环境:
Python版本:3.6.9
OS:MacOS 11.6.1
测试数据:
文件名:testdata.xlsx
size:14.5MB
65600行,25列
文件名:testdata.csv
size:9.6MB
65600行,25列
# workbook.py from openpyxl import load_workbook wb = load_workbook(filename='/Users/yourPath/Downloads/testdata.xlsx', data_only=True) def get_all_sheet_copy(table='物品配置表.xlsx', start_row=6): all_sheet_data = {} for sheet in wb.sheetnames: sheet_datas = {} ws = wb[sheet] rows_data = np.array([[i.value for i in row] for row in ws.rows])[6:] field_data = rows_data[0] nw = np.where(rows_data[1:] < 1000) rows_data = np.delete(rows_data,nw[0],0) for i in range(1,len(field_data)): sheet_datas[field_data[i]] = list(rows_data[:,i]) all_sheet_data[sheet] = sheet_datas return all_sheet_data
运行之后看看结果:
load数据总耗时 40.8秒,parse耗时29.9秒;
函数get_all_sheet_copy 耗时6.4秒
# workbook.py from openpyxl import load_workbook wb = load_workbook(filename='/Users/yourPath/Downloads/testdata.xlsx', data_only=True, read_only=True) def get_all_sheet_copy(table='物品配置表.xlsx', start_row=6): all_sheet_data = {} for sheet in wb.sheetnames: sheet_datas = {} ws = wb[sheet] rows_data = np.array([[i.value for i in row] for row in ws.rows])[6:] field_data = rows_data[0] nw = np.where(rows_data[1:] < 1000) rows_data = np.delete(rows_data,nw[0],0) for i in range(1,len(field_data)): sheet_datas[field_data[i]] = list(rows_data[:,i]) all_sheet_data[sheet] = sheet_datas return all_sheet_data
运行之后看看结果:
load_workbook数据耗时 45毫秒,parse耗时24.2秒;
我的函数get_all_sheet_copy 耗时29.3秒
只读模式和上面对比,总体效率更高,但前提是你的业务适合用只读模式。
# workbook.py import xlrd wk = xlrd.open_workbook('/Users/yourPath/Downloads/testdata.xlsx') def get_all_sheet_copy(table='物品配置表.xlsx', start_row=6): # wb = load_workbook(filename=f'{table}', data_only=True) all_sheet_data = {} for sheet in wk.sheet_names(): sheet_datas = {} ws = wk.sheet_by_name(sheet) rows_data = np.array([ws.row_values(row_index) for row_index in range(7,ws.nrows)],dtype='int64') # rows_data = np.array([row for row in ws.get_rows()]) field_data = ws.row_values(6) nw = np.where(rows_data < 1000) rows_data = np.delete(rows_data,nw[0],0) for i in range(1,len(field_data)): sheet_datas[field_data[i]] = list(rows_data[:,i]) all_sheet_data[sheet] = sheet_datas return all_sheet_data
运行之后看看结果:
open_workbook数据耗时 22秒;
我的函数get_all_sheet_copy 耗时0.91秒
对比openpyxl的只读模式要快约7秒。
最后还有更快的xlwings和win32com,结合业务需求来选择。
# workbook.py
import csv
with open('/Users/yourPath/Downloads/testdata.csv') as f:
reader = list(csv.reader(f))
rows = [[int(i) for i in row] for row in reader[1:]]
运行之后:
加载数据耗时 1.3秒;
对比xlsx,这速度真的没法比,如果能把xlsx转成csv的尽量转
这里借用人家做的测试结果图:
.xlsx文件 我这里优先用xlrd 其次是openpyxl只读模式
图里是win32com和openpyxl 效率较高,但有依赖
最后是CSV,快是快,但先把文件转成.csv格式
欢迎小伙伴关注微信公众号ID:gameTesterGz
或关注我的CSDN:https://blog.csdn.net/qq_32557025
谢谢各位的关注、点赞!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。