Skip to content

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.