性能

OpenPYXL试图平衡功能和性能。如果有疑问,我们将重点放在功能上而不是优化上:一旦建立了API,性能调整就更容易了。与其他库和应用程序相比,内存使用率相当高,大约是原始文件大小的50倍,例如,50 MB Excel文件的内存使用率为2.5 GB。由于许多用例只涉及读或写文件,因此 优化模式 模式意味着这不是一个问题。

基准点

所有基准点都是合成的,非常依赖于硬件,但它们仍然可以给出指示。

写入性能

这个 benchmark code 可以调整以使用更多的工作表,并调整字符串数据的比例。因为所使用的Python版本也会显著影响性能,所以 driver script 也可以用于在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

读取性能

性能是使用以前提供的文件来衡量的 bug report 与旧的XLRD库相比。XLRD主要用于.xls文件的旧BIFF文件格式,但它对XLSX的支持有限。

的代码 benchmark 显示使用文件时选择正确选项的重要性。在这种情况下,禁用外部链接会停止OpenPYXL打开链接工作表的缓存副本。

库之间的一个主要区别是OpenPYXL的只读模式几乎可以立即打开一个工作簿,使其适合多个进程,这也可以显著地读取内存使用。XLRD也不会自动将日期和时间转换为python日期时间,尽管它会相应地注释单元格,但在客户机代码中这样做会显著降低性能。

Versions:
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。

Sample code 使用与read performance相同的源文件表明,由于创建了额外的Python进程,性能可以合理地扩展,只需要少量的开销。

Parallised Read
    Workbook loaded 1.12s
    >>DATA>> 2.27s
    Output Model 2.30s
    Store days 100% 37.18s
    OptimizationData 44.09s
    Store days 0% 45.60s
    Total time 46.76s