  Uproot reads ROOT TTrees using pure Python. For numerical and (singly) jagged
arrays, this is fast because a whole block of data can be interpreted as an
array without modifying the data. For other cases, such as arrays of
std::vector<std::vector<float>>, numerical data are interleaved with structure,
and the only way to deserialize them is with a sequential algorithm. When
written in Python, such algorithms are very slow.
  We solve this problem by writing the same logic in a language that can be
executed quickly. AwkwardForth is a Domain Specific Language (DSL), based on
Standard Forth with I/O extensions for making Awkward Arrays, and it can be
interpreted as a fast virtual machine without requiring LLVM as a dependency.
We generate code as late as possible to take advantage of optimization
opportunities. All ROOT types previously implemented with Python have been
converted to AwkwardForth. Double and triple-jagged arrays, for example, are
400x faster in AwkwardForth than in Python, with multithreaded scaling up to 1
second/GB because AwkwardForth releases the Python GIL. We also investigate the
possibility of JIT-compiling the generated AwkwardForth code using LLVM to
increase the performance gains. In this paper, we describe design aspects,
performance studies, and future directions in accelerating Uproot with
AwkwardForth.
