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万行の場合
ライブラリ | 書き込み時間 | 読み込み時間 |
---|---|---|
OpenPyXL | 0.364 | 0.400 |
XlsxWriter | 0.268 | 0.464 |
Pandas | 0.430 | 0.366 |
pylightxl | 1.708 | 0.409 |
2万行の場合
ライブラリ | 書き込み時間 | 読み込み時間 |
---|---|---|
OpenPyXL | 0.668 | 0.821 |
XlsxWriter | 0.547 | 0.705 |
Pandas | 0.786 | 0.701 |
pylightxl | 12.298 | 0.857 |
3万行の場合
ライブラリ | 書き込み時間 | 読み込み時間 |
---|---|---|
OpenPyXL | 1.026 | 1.245 |
XlsxWriter | 0.808 | 1.132 |
Pandas | 1.153 | 1.041 |
pylightxl | 27.217 | 1.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は小規模なデータ処理に限定して使用することが望ましいと言えます。
この記事が、あなたの役に立てば幸いです!
コメント