Skip to main content
These figures are the project’s own, measured on Python 3.13.1, AMD Ryzen 9 7900X, 24 CPUs, 64 GB RAM, with 15 repetitions per measurement, each isolated in a subprocess with peak-RSS tracking. Your hardware will differ.

One million rows

Versions under test: Jetxl 0.3.0, Polars 1.42.1, PyArrow 24.0.0, Pandas 3.0.3, PyExcelerate 0.13.0, rustpy-xlsxwriter 0.5.2, openpyxl 3.1.5, XlsxWriter 3.2.9.

Across sizes

At 10K rows the gap is nine milliseconds against four hundred. Real, but rarely decisive. The case for Jetxl gets strong somewhere past 100K rows, or when memory is the binding constraint.

Memory

Worth separating from speed, because the ranking differs. Jetxl uses 958 MB at a million rows, while polars.write_excel uses 3.13 GB and pandas + openpyxl uses 2.95 GB. But rustpy_xlsxwriter uses 238 MB, four times less than Jetxl, while being 6.5 times slower. If memory is tighter than time, that trade may favor it.

Where the speed comes from

Jetxl reads values from DataFrame buffers in place, with no intermediate Python objects.
Hardware-accelerated string processing for the escaping every cell requires.
Output size is computed up front, so each sheet allocates once instead of growing repeatedly.
Multi-sheet XML is produced across threads.
ZIP compression happens on the fly rather than over a finished buffer.

Cost of options

Not every feature is free.
auto_width measures every row to size columns. On large exports set explicit column_widths instead. The project’s own guidance is to disable auto-width for speed.
Output files are also somewhat larger than XlsxWriter’s, which compresses more aggressively.