Benchmarks¶
dpm-xbrl compared with the Python packages used for the same job: eba-xbridge, Arelle, py-xbrl and brel-xbrl. Their scope differs, so the capabilities come first; the timings cover only tasks several tools do.
Capabilities¶
| dpm-xbrl | eba-xbridge | Arelle | py-xbrl | brel-xbrl | |
|---|---|---|---|---|---|
| Licence | MIT | Apache-2.0 | Apache-2.0 | GPL-3.0 | Apache-2.0 |
| Runtime dependencies | none | lxml, numpy, pandas | 15 | 2 | 17 |
| Reads EBA XBRL-XML | yes | yes | with the taxonomy | no | no |
| Reads EBA xBRL-CSV | yes | no | with the taxonomy | no | no |
| Works without the taxonomy | yes | yes | no | no | no |
| Millions of facts in seconds | yes (frames) |
no | no | no | no |
| Converts XML → xBRL-CSV | yes, EBA layout | yes, EBA layout | generic OIM (plugin) | no | no |
| Converts xBRL-CSV → XML | yes | no | generic OIM (plugin) | no | no |
| EBA filing rules, with rule numbers | yes, while reading | yes | older plugin | no | no |
| CLI with JSON and CI exit status | yes | JSON | yes | no | no |
| Outside dpm-xbrl's scope: | |||||
| Taxonomy validation (schemas, formulas) | no | no | yes | no | no |
| EBA validation rules on values | via dpm-xl | no | yes, slowly | no | no |
| Other filings (SEC, ESEF) | no | no | yes | yes | yes |
py-xbrl cannot find the DPM 2.0 taxonomy, and brel-xbrl downloads it and runs out of memory, so neither reads EBA reports today.
Timings¶
Measured on 2026-10-24: AMD Ryzen 7 4700U with Radeon Graphics, 8 cores, 15 GB, Linux 7.0.0-38-generic; load average when measured 2.4, 2.7, 3.0. dpm-xbrl at commit 088ceef.
| Tool | Version | Python |
|---|---|---|
| Arelle | 2.47.2 | 3.12.3 |
| dpm-xbrl | 1.0.0 | 3.12.3 |
| eba-xbridge | 2.2.1 | 3.12.3 |
| Task | dpm-xbrl | eba-xbridge | Arelle |
|---|---|---|---|
| Import the package | 0.09 s, 24 MB | 0.32 s, 71 MB | 0.46 s, 63 MB |
Read EBA-COREP_OF.xbrl (22.9 MB, 21,314 facts) |
1.27 s, 82 MB | 3.56 s, 461 MB | 92.07 s, 6,053 MB (1 run) |
Read EBA-FINREP9.xbrl (13.3 MB, 13,384 facts) |
0.81 s, 61 MB | 2.06 s, 302 MB | 68.00 s, 4,396 MB (1 run) |
Read EBA-COREP_OF.csv.zip (25,677 facts) |
0.23 s, 37 MB | cannot read xBRL-CSV | 115.25 s, 6,147 MB (1 run) |
Read EBA-COREP_OF.csv.zip with the taxonomy's metadata resolved |
1.27 s, 161 MB | cannot read xBRL-CSV | n/a |
Read EBA-FINREP9.csv.zip (14,148 facts) |
0.16 s, 30 MB | cannot read xBRL-CSV | not measured |
EBA filing-rule check, EBA-COREP_OF.xbrl |
1.28 s, 82 MB | 18.29 s, 1,124 MB | not measured |
EBA filing-rule check, EBA-COREP_OF.csv.zip |
0.22 s, 37 MB | 1.51 s, 153 MB | not measured |
Read COREP_LE, 7.3 million facts (frames for dpm-xbrl) |
0.90 s, 941 MB | 23.07 s, 2,261 MB | not attempted |
| Read COREP_LE, 7.3 million facts, one object per fact | 44.58 s, 4,831 MB (1 run) | see the row above | not attempted |
Read FINREP9, 7.3 million facts (frames) |
1.50 s, 1,213 MB | not measured | not attempted |
Read COREP_LE, 21.9 million facts in one 587 MB table (frames) |
2.15 s, 2,195 MB | not measured | not attempted |
Convert EBA-COREP_OF.xbrl to xBRL-CSV |
2.47 s, 141 MB | 41.69 s, 499 MB | n/a |
Convert EBA-FINREP9.xbrl to xBRL-CSV |
1.47 s, 91 MB | 27.67 s, 324 MB | n/a |
- Times include starting Python. Arelle runs load the EBA 4.2 taxonomy packages as part of reading, and count the filing indicators as facts.
- dpm-xbrl checks the filing rules while it reads, so its filing-rule rows are read times; eba-xbridge runs
validate(eba=True). - eba-xbridge cannot read xBRL-CSV; its time on the 7.3-million-fact package is its
validate(eba=True). - dpm-xbrl converts with the EBA 4.2 taxonomy packages (
write_xbrl_csv(..., taxonomy_packages=...)), including opening them.
Sample reports read (109 files: the EBA samples and three synthetic packages):
- dpm-xbrl: 109/109
-
eba-xbridge: loaded 52/52 XML, validated 109/109
-
dpm-xbrl and eba-xbridge read the same facts from every EBA XML sample; Arelle also counts filing indicators as facts.
- Arelle needs the taxonomy to load any report, which makes it slow and large here; in return it validates against the taxonomy.
- Converted packages match the EBA's own xBRL-CSV samples table for table on all 53 official sample pairs.
Reproduce¶
Set up benchmarks/.venvs as in
benchmarks/README.md,
then run uv run python benchmarks/run.py --samples SAMPLES --taxonomy
TAXONOMY and python benchmarks/render.py.