社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python-openpyxl教程(三)

庄周幻梦 • 3 年前 • 340 次点击  

前文:
Python-openpyxl教程(一): 教程篇
Python-openpyxl教程(二): 简单使用篇

性能

openpyxl尝试在功能和性能之间取得平衡。如有疑问,我们将重点放在优化功能上:建立API后,性能调整将变得更加容易。与其他库和应用程序相比,内存使用率很高,约为原始文件大小的50倍。例如50MB Excel文件为2.5GB。由于许多用例仅涉及读取或写入文件,因此"性能模式"模式意味着问题不大。

BenchMarks

所有基准都是综合性的,并且高度依赖于硬件,但是它们仍然可以提供指示。

写入性能

所述 基准代码 可以调整,以使用更多的片材,并调整数据的比例是字符串。由于使用的Python版本也会显著影响性能,因此也可以使用 驱动程序脚本 在有tox环境的情况下对不同的Python版本进行测试。

性能与出色的替代库xlsxwriter进行了比较

Versions:
python: 3.6.9
openpyxl: 3.0.1
xlsxwriter: 1.2.5

Dimensions:     #尺寸
    Rows = 1000
    Cols = 50
    Sheets = 1
    Proportion text = 0.10

Times:
    xlsxwriter            :   0.59
    xlsxwriter (optimised):   0.54
    openpyxl              :   0.73
    openpyxl (optimised)  :   0.61


Versions:
python: 3.7.5
openpyxl: 3.0.1
xlsxwriter: 1.2.5

Dimensions:
    Rows = 1000
    Cols = 50
    Sheets = 1
    Proportion text = 0.10

Times:
    xlsxwriter            :   0.65
    xlsxwriter (optimised):   0.53
    openpyxl              :   0.70
    openpyxl (optimised)  :   0.63


Versions:
python: 3.8.0
openpyxl: 3.0.1
xlsxwriter: 1.2.5

Dimensions:
    Rows = 1000
    Cols = 50
    Sheets = 1
    Proportion text = 0.10

Times:
    xlsxwriter            :   0.54
    xlsxwriter (optimised):   0.50
    openpyxl              :   1.10
    openpyxl (optimised)  :   0.57
    
\color {skyblue} {!备注}
\color {skyblue} {从不同Python版本下写入相同数据的耗时对比,xlsxwriter要明显优于openpyxl,包括在优化模式下。}

读取性能

使用以前的 错误报告 提供的文件来衡量性能,并与较早的xlrd库进行比较。xlrd主要用于.xls文件的较旧BIFF文件格式,但是它对XLSX的支持有限。

Benchmark 的代码显示了在处理文件时选择正确选项的重要性。在这种情况下,禁用外部连接将停止openpyxl打开链接的工作表的缓存副本。

库之间的主要区别在于,openpyxl的只读模式几乎可以立即打开工作薄,使其适合于多个线程,这也大大减少了内存的使用。尽管xlrd会相应的注释单元格,但是xlrd不会自动将日期和时间转换为Python日期时间,但是在客户端代码这样做会大大降低性能。

python: 3.6.9
xlread: 1.2.0
openpyxl: 3.0.1

openpyxl, read-only
    Workbook loaded 1.14s
    OptimizationData 23.17s
    Output Model 0.00s
    >>DATA>> 0.00s
    Store days 0% 23.92s
    Store days 100% 17.35s
    Total time 65.59s
    0 cells in total

Versions:
python: 3.7.5
xlread: 1.2.0
openpyxl: 3.0.1

openpyxl, read-only
    Workbook loaded 0.98s
    OptimizationData 21.35s
    Output Model 0.00s
    >>DATA>> 0.00s
    Store days 0% 20.70s
    Store days 100% 16.16s
    Total time 59.19s
    0 cells in total

Versions:
python: 3.8.0
xlread: 1.2.0
openpyxl: 3.0.1

openpyxl, read-only
    Workbook loaded 0.90s
    OptimizationData 19.58s
    Output Model 0.00s
    >>DATA>> 0.00s
    Store days 0% 19.35s
    Store days 100% 15.02s
    Total time 54.85s
    0 cells in total

并行化

读取工作表会占用大量CPU,这限制了并行化可带来的任何好处。但是,如果您主要对转储工作薄的内容感兴趣,则可以使用openpyxl的只读模式并打开工作薄的多个实例,并利用多个CPU。

使用与读取性能相同的源文件的示例代码显示,由于创建了额外的Python进程,因此性能可以合理地扩展而开销却很小。


来源: https://openpyxl.readthedocs.io/en/stable/performance.html

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110843
 
340 次点击