解决python执行较大excel文件openpyxl慢问题


Posted in Python onMay 15, 2020

我就废话不多说了,大家还是直接看代码吧!

talk is cheap

from openpyxl import Workbook
  from openpyxl.utils import get_column_letter
  from openpyxl import load_workbook
  import time
  wb = load_workbook("E:/a.xlsx", read_only=True)
  sh = wb["Sheet"]
  # rowItem = {}
  # for j in range(1,2000):
  #   for i in range(1, 30):
  #     rowItem[get_column_letter(i)] = i
  #   sh.append(rowItem)
  # wb.save("E:/a.xlsx")
  t0 = time.time()
  print(sh['V500'].value)
  t1 = time.time()
  print("openpyxl所用时间:", str(t1-t0))

  import xlrd
  xlsPath = "E:/a.xlsx"
  WorkBook = xlrd.open_workbook(xlsPath)
  sh = WorkBook.sheet_by_name("Sheet")

  t0 = time.time()
  print(sh.cell(499,22).value)
  t1 = time.time()
  print("xlrd所用时间:", str(t1-t0))

测试结果:

22
openpyxl所用时间: 0.44217610359191895
23.0
xlrd所用时间: 0.0010063648223876953

结论

openpyxl的慢是读取慢,可以选择xlrd代替,详细测试下面继续

不直接使用xlwt+xlrd是因为xlwt仅支持2003及以下版本,最大行数限制在65536,不够用,而openpyxl大概在一百多万

主要的说完了,下面详细说了:在写工具的时候遇到的这个问题,开始是用的xlwt+xlrd,然后行数超标了,没办法换成openpyxl使用excel2007的版本,原本测试不到三万行的数据,只要三四秒,换成openpyxl以后,花了好几分钟,具体没看多少了,然后加上函数运行时间的监视器以后,才看到是读取的时候出的问题

推测原因:

推测的话,openpyxl的根据行号列号读取的时候,是从第一行第一列开始遍历,直到行号等于指定行号,列号等于指定列号,所以要读取的行号列号越多就越慢,(也可能是从第一个有数据的行或列),而xlrd则是类似与数组一样,我们要取第几个元素,直接根据下标找到内存中对应地址的元素即可,所以无论excel总量多少,速度基本都是不变的

留下的坑

xlwt写入仅支持65536行,那xlrd的读取很可能也是,也就是超过这么多的数据可能也会出错

我这里因为是读多表数据生成单表数据,生成方式大概是Na*Nb这样,所以实际读取的不会太多,但生成的很多,所以基本可以用考虑这个问题

另外,据说xlrd读取xlsx格式的偶尔会出现问题,具体没测试,暂时用还没毛病

最后,顺带上一下监控函数运行时间的装饰器吧:

import time
from functools import wraps

def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
      (function.__name__, str(t1-t0))
      )
    return result
  return function_timer

使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了

以上这篇解决python执行较大excel文件openpyxl慢问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python中存取文件的4种不同操作
Jul 02 Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
Python可以用来做什么
Nov 23 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
python实现会员信息管理系统(List)
Mar 18 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 Python
详解Python中__new__方法的作用
Mar 31 Python
python可迭代对象去重实例
May 15 #Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 #Python
Python实现UDP程序通信过程图解
May 15 #Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 #Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 #Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 #Python
django 利用Q对象与F对象进行查询的实现
May 15 #Python
You might like
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python使用插值法画出平滑曲线
2018/12/15 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python 随机森林算法及其优化详解
2019/07/11 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
区分python中的进程与线程
2020/08/13 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
UDP协议功能
2013/01/06 面试题
params有什么用
2016/03/01 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
公司财务部岗位职责
2015/04/14 职场文书