解决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计算三角函数之acos()方法的使用
May 15 Python
Python探索之Metaclass初步了解
Oct 28 Python
理解python中生成器用法
Dec 20 Python
python 自定义对象的打印方法
Jan 12 Python
Django logging配置及使用详解
Jul 23 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 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
PHP制作图型计数器的例子
2006/10/09 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
PHP XML数据解析代码
2010/05/26 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
js中function()使用方法
2013/12/24 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
js闭包用法实例详解
2016/12/13 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python实现代码统计程序
2019/09/19 Python
python 字段拆分详解
2019/12/17 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
党员四风自我剖析材料
2014/10/07 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
大学生操行评语大全
2014/12/31 职场文书
党员转正党支部意见
2015/06/02 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python