machine: Intel(R) Xeon(R) Processor @ 2.10GHz | 2 cores | 3.13.16 | Ubuntu clang version 18.1.3 (1ubuntu1)

=== 1. relu(x*y+1) on N floats, three ways ===
python interpreter (evaluate)              4664 ns per element   (measured on 20,000 elements, scaled to 200,000)
compiled C, one ctypes call each            756 ns per element   (200,000 elements)
compiled C, loop inside C                  0.96 ns per element   (20,000,000 elements)
ratio interpreter / C loop: 4,881x   ctypes call / C loop: 791x

=== 2. clang compile time against the number of statements (a chain of adds and multiplies on one float) ===
statements       -O0       -O1       -O2  (seconds, median of 3, includes starting clang)
        10     0.027     0.029     0.026
       100     0.024     0.027     0.027
      1000     0.036     0.081     0.082
      5000     0.109     0.652     0.693

=== 3. building and simplifying index graphs ===
300 random index expressions: 4,311 nodes if each is counted alone, 2,106 distinct nodes in memory
memory while building them (python objects, measured by tracemalloc): 870 KiB, 423 bytes per distinct node
simplify on all 300: 52 ms, 82,169 nodes per second (nodes counted per expression, before simplifying); 2,735 nodes after
p=p+p repeated 18 times: 19 nodes in the graph; as a tree it would have 524,287
