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

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

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

  2. 语言
    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小白,本篇文章纯属是个人见解为主,如果大家有更好的操作方法也请指正,谢谢)

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值