> ## Documentation Index
> Fetch the complete documentation index at: https://jetxl.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Performance

> Published benchmarks and where the speed comes from

<Note>
  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.
</Note>

## One million rows

| Library             | Time      | Relative    | Throughput   | Peak memory |
| ------------------- | --------- | ----------- | ------------ | ----------- |
| **jetxl (arrow)**   | **0.66s** | baseline    | 1506K rows/s | 958 MB      |
| jetxl (dict)        | 1.41s     | 2.1x slower | 708K rows/s  | 1.24 GB     |
| rustpy\_xlsxwriter  | 4.32s     | 6.5x slower | 232K rows/s  | 238 MB      |
| pyexcelerate        | 18.62s    | 28x slower  | 54K rows/s   | 711 MB      |
| xlsxwriter          | 23.84s    | 36x slower  | 42K rows/s   | 602 MB      |
| polars.write\_excel | 26.57s    | 40x slower  | 38K rows/s   | 3.13 GB     |
| pandas + xlsxwriter | 40.21s    | 61x slower  | 25K rows/s   | 1.22 GB     |
| openpyxl            | 42.46s    | 64x slower  | 24K rows/s   | 602 MB      |
| pandas + openpyxl   | 56.07s    | 84x slower  | 18K rows/s   | 2.95 GB     |

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

| Library            | 10K rows  | 100K rows | 1M rows  |
| ------------------ | --------- | --------- | -------- |
| **jetxl (arrow)**  | **0.009** | **0.061** | **0.66** |
| jetxl (dict)       | 0.014     | 0.125     | 1.41     |
| rustpy\_xlsxwriter | 0.043     | 0.43      | 4.32     |
| xlsxwriter         | 0.24      | 2.32      | 23.84    |
| openpyxl           | 0.40      | 4.12      | 42.46    |

<Tip>
  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.
</Tip>

## 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

<AccordionGroup>
  <Accordion title="Zero-copy Arrow access" icon="bolt">
    Jetxl reads values from DataFrame buffers in place, with no intermediate Python objects.
  </Accordion>

  <Accordion title="SIMD XML escaping" icon="microchip">
    Hardware-accelerated string processing for the escaping every cell requires.
  </Accordion>

  <Accordion title="Pre-calculated buffers" icon="ruler">
    Output size is computed up front, so each sheet allocates once instead of growing repeatedly.
  </Accordion>

  <Accordion title="Parallel sheet generation" icon="layer-group">
    Multi-sheet XML is produced across threads.
  </Accordion>

  <Accordion title="Streaming compression" icon="file-zipper">
    ZIP compression happens on the fly rather than over a finished buffer.
  </Accordion>
</AccordionGroup>

## Cost of options

Not every feature is free.

<Warning>
  `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.
</Warning>

Output files are also somewhat larger than XlsxWriter's, which compresses more aggressively.
