PythonのExcelライブラリ性能比較 – 大量データの読み書き速度を検証

Pythonには多くのExcel操作ライブラリが存在します。今回は主要なライブラリの性能を比較するため、1万行から3万行までのデータを使用して読み書きの速度を検証しました。

テスト用プログラム

以下のプログラムを使用して性能を測定しました:

import time
import pandas as pd
from openpyxl import Workbook
from openpyxl import load_workbook
from xlsxwriter import Workbook as XlsxWriterWorkbook
import xlrd
import xlwt
import xlwings as xw
import pylightxl as pl
import pyexcel

TEST_NUM = 30000

def test_openpyxl():
    # 書き込みテスト
    start_time = time.time()
    wb = Workbook()
    ws = wb.active
    for i in range(1, TEST_NUM+1):
        ws.append([f"Row {i}", i])
    wb.save("openpyxl_test.xlsx")
    write_time = time.time() - start_time

    # 読み込みテスト
    start_time = time.time()
    wb = load_workbook("openpyxl_test.xlsx")
    ws = wb.active
    data = [[cell.value for cell in row] for row in ws.iter_rows()]
    read_time = time.time() - start_time

    return write_time, read_time

def test_xlsxwriter():
    # 書き込みテスト
    start_time = time.time()
    wb = XlsxWriterWorkbook("xlsxwriter_test.xlsx")
    ws = wb.add_worksheet()
    for i in range(TEST_NUM):
        ws.write(i, 0, f"Row {i+1}")
        ws.write(i, 1, i+1)
    wb.close()
    write_time = time.time() - start_time

    # 読み込みにはpandasを使用(XlsxWriterは書き込み専用)
    start_time = time.time()
    df = pd.read_excel("xlsxwriter_test.xlsx")
    read_time = time.time() - start_time

    return write_time, read_time

def test_pandas():
    # 書き込みテスト
    start_time = time.time()
    df = pd.DataFrame({
        'Text': [f"Row {i}" for i in range(1, TEST_NUM+1)],
        'Number': range(1, TEST_NUM+1)
    })
    df.to_excel("pandas_test.xlsx", index=False, header=False) 
    write_time = time.time() - start_time

    # 読み込みテスト
    start_time = time.time()
    df = pd.read_excel("pandas_test.xlsx", header=None) 
    read_time = time.time() - start_time

    return write_time, read_time

def test_pylightxl():
    # 書き込みテスト
    start_time = time.time()
    db = pl.Database()
    db.add_ws("Sheet1")
    for i in range(1, TEST_NUM+1):
        db.ws("Sheet1").update_index(row=i, col=1, val=f"Row {i}")
        db.ws("Sheet1").update_index(row=i, col=2, val=i)
    pl.writexl(db=db, fn="pylightxl_test.xlsx")
    write_time = time.time() - start_time

    # 読み込みテスト
    start_time = time.time()
    db = pl.readxl("pylightxl_test.xlsx")
    data = [[db.ws("Sheet1").index(row=r, col=c) for c in range(1, 3)] 
            for r in range(1, TEST_NUM+1)]
    read_time = time.time() - start_time

    return write_time, read_time
    
def main():
    results = {}
    
    print("テスト開始...")
    
    results["OpenPyXL"] = test_openpyxl()
    results["XlsxWriter"] = test_xlsxwriter()
    results["Pandas"] = test_pandas()
    results["pylightxl"] = test_pylightxl()

    print(f"\nLinenum:{TEST_NUM}")

    print("\n結果(秒):")
    print(f"{'ライブラリ':<15} {'書き込み時間':>12} {'読み込み時間':>12}")
    print("-" * 40)
    for lib, (write_time, read_time) in results.items():
        print(f"{lib:<15} {write_time:>12.3f} {read_time:>12.3f}")

if __name__ == "__main__":
    main()

主要なExcelライブラリの特徴

OpenPyXL

最も広く使用されているExcelライブラリの一つです。xlsx、xlsm、xltx、xltmファイルの読み書きに対応し、Excel 2010以降のファイル形式をサポートしています。Pandasのデフォルトリーダーとしても採用されています。

XlsxWriter

Excel 2010形式(.xlsx)の書き込みに特化したライブラリです。データ出力や図表作成が得意で、豊富なフォーマット機能を提供します。

Pandas

データ分析に特化したライブラリで、read_excel/to_excel関数でExcelファイルの入出力が可能です。大規模データセットの処理に適しています。

pylightxl

軽量な読み書きライブラリで、外部依存のない単独での動作が特徴です。

性能比較テスト結果

1万行の場合

ライブラリ書き込み時間読み込み時間
OpenPyXL0.3640.400
XlsxWriter0.2680.464
Pandas0.4300.366
pylightxl1.7080.409

2万行の場合

ライブラリ書き込み時間読み込み時間
OpenPyXL0.6680.821
XlsxWriter0.5470.705
Pandas0.7860.701
pylightxl12.2980.857

3万行の場合

ライブラリ書き込み時間読み込み時間
OpenPyXL1.0261.245
XlsxWriter0.8081.132
Pandas1.1531.041
pylightxl27.2171.490

結果の分析

特筆すべき点として、pylightxlの書き込み性能が行数の増加に伴って急激に低下していることが挙げられます:

  • 1万行:約1.7秒
  • 2万行:約12.3秒
  • 3万行:約27.2秒

一方で、他のライブラリは行数の増加に対して比較的線形な性能劣化を示しています。

ライブラリ比較表

ライブラリ名得意分野特徴推奨用途
OpenPyXL汎用的な Excel 操作バランスの取れた性能、豊富な機能一般的な Excel 操作全般
XlsxWriter書き込み処理高速な書き込み、充実したフォーマット機能レポート生成、大量データ出力
Pandasデータ分析データフレームとの連携、分析機能データ分析、統計処理
pylightxlシンプルな操作依存関係が少ない、軽量少量データの単純な読み書き

まとめ

性能テストの結果から、以下のことが明らかになりました:

  • XlsxWriterは一貫して最も高速な書き込み性能を示しました
  • Pandasは読み込み速度で安定した性能を発揮しました
  • OpenPyXLは書き込みと読み込みともにバランスの取れた性能を示しました
  • pylightxlは読み込み性能は他のライブラリと同等ですが、書き込み性能は行数の増加に対して著しく低下することが判明しました

これらの結果から、大規模データを扱う場合はXlsxWriterやPandas、一般的な使用にはOpenPyXLが推奨されます。pylightxlは小規模なデータ処理に限定して使用することが望ましいと言えます。

この記事が、あなたの役に立てば幸いです!

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村