Proper package version bump (Cargo). Tags v0.2.11 / v0.2.12 did not raise the
wheel version (still 0.2.1), so PyPI never got a new release from those tags.
- Benchmark suite: stream backends (
et_iterparse,sax,lxml_iterparse) vsxml_iterator, sharedbench_common.py, results JSON, README tables auto-rendered from JSON. make show-benchmarks/scripts/print_benchmarks.pypretty-print last results (stdlib).make readme-benchmarks/scripts/update_readme_benchmarks.pyrewrite README from JSON.- One stream table per file: full multi-backend drain if ≤150 MB (SwissProt); else early exit first 1M events only (FIRDS). Synthetic: large full drain + early-exit vs full dict.
- Early-exit caps large enough for signal (not 10 ms noise). SAX is N/A for early-exit (adapter materializes full parse first); SAX full drain skipped above 20 MB (RAM).
- Commit
benchmark_data/benchmark_results.jsonsnapshot; drop machine hostname from docs.
Last PyPI release before 0.2.13. See tag v0.2.1 / git history for that snapshot.
- Malformed XML and undecodable text raise
ValueError(no silent truncation). - Attribute events opt-in:
iter_xml(path, attributes=True)→('attr', (name, value)). xml_iterator.xml_to_dictincludes attributes (@name) and matchesxmltodict.parse; dict built in Rust (one FFI crossing). Python reference kept asxml_to_dict_pyfor parity tests.- CDATA yielded as
textevents (was dropped). - Self-closing tags (
<tag/>) counted correctly by bothget_edge_countsimplementations. xml_to_dict(max_depth=...)no longer strands the stack / drops siblings.- Normalization is iterative (no Python recursion limit on deep documents).
make developbuilds release by default; usemake develop-debugfor debug.
See PERF_2026-07-17.md for measured impact.
Earlier streaming iterator + Python-side dict build; see git history.