【理论结合实践】对于xlrd、openpyxl、xlwings读取的速度的一个分析

您所在的位置:网站首页 python读取excel非常慢应该如何优化 【理论结合实践】对于xlrd、openpyxl、xlwings读取的速度的一个分析

【理论结合实践】对于xlrd、openpyxl、xlwings读取的速度的一个分析

2023-11-11 18:10| 来源: 网络整理| 查看: 265

由于肺炎封城在家,没有开学,实习也还没有开始,所以我把去年的实习实践中做的一些数据分析小算法进行一个再查看的过程,然后其中一个算法引起了我的注意,这个算法主要是为了公司里的一个ID信息的一个数据分析,大概问题是这样的: 在一个树(非二叉树)中选取一个结点,以这个节点为根节点,将这颗子树上的所有结点值输出(不分先后)。

数据情况 一个excel表,表中2列、631040行数据,第1列为所有的结点,第2列为前一列结点的父结点。一共11.1MB的数据

语言 python

算法其实很简单,就根据深度优先算法进行处理,其中在读取数据的时候我用的openpyxl,将两列数据分别读入两个父子列表进行查询,openpyxl的代码是这样的:

# 采用openpyxl读取 childlist = [] fatherlist = [] excel = openpyxl.load_workbook(fileexcel) table = excel['Sheet1'] rownum = table.max_row for i in range(2,rownum + 1): childnum = table.cell(row = i, column = 1).value fathernum = table.cell(row = i, column = 2).value childlist.append(childnum) fatherlist.append(fathernum)

事实上就是一个遍历获取的过程,然后我这几天尝试用xlwings和xlrd来进行数据读取

# 采用xlwings整列读取 app = xw.App(visible=False, add_book=False) excel = app.books.open(fileexcel) table = excel.sheets[0] print(table) rownum = table.api.UsedRange.Rows.count print(rownum) childlist = table.range((1, 1), (rownum, 1)).value fatherlist = table.range((1, 2), (rownum, 2)).value # 采用xlwings遍历读取 childlist = [] fatherlist = [] excel = openpyxl.load_workbook(fileexcel) table = excel.sheets[0] rownum = table.api.UsedRange.Rows.count for i in range(2,rownum + 1): childnum = table.cell(row = i, column = 1).value fathernum = table.cell(row = i, column = 2).value childlist.append(childnum) fatherlist.append(fathernum) # 采用xlrd遍历读取 childlist = [] fatherlist = [] excel = xlrd.open_workbook(fileexcel) table = excel.sheet_by_index(0) rownum = table.nrows for i in range(1, rownum): childnum = table.cell(i, 0).value fathernum = table.cell(i, 1).value childlist.append(childnum) fatherlist.append(fathernum) # 采用xlrd整列读取 excel = xlrd.open_workbook(fileexcel) table = excel.sheet_by_index(0) rownum = table.nrows childlist = table.col_values(0) fatherlist = table.col_values(1)

我顺便把时间也给记录了下来,结果是这样的:

读取方法读取时间(秒)openpyxl读取(遍历)36.377采用xlwings读取(整列)8.129采用xlwings读取(遍历)300秒后未处理完采用xlrd读取(整列)24.923采用xlrd读取(遍历)26.262

排除时间浮动,从中发现xlwings整列读取的速度非常快,但遍历速度相当慢,openpyxl的总体情况慢一点,xlrd读取处于中游,但是整列和遍历两种情况下读取速度相差不大,我想这应该是写法不同而已,处理时按照的方法应该都是遍历吧,基于xlwings与vba的关系,我想可能在读取的时候vba进行了处理,对于openpyxl的话,我查找了网上的信息,没有找到整列读取的代码写法,所以没能进行测试。

(ps:python小白,本篇文章纯属是个人见解为主,如果大家有更好的操作方法也请指正,谢谢)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3