Faster startup -- Experiment B -- streamline and tweak

This is a placeholder for a description of Experiment B (see #32 (comment))

  • try to speed up unmarshalling of code objects by low-level optimizations

  • streamline code objects (fewer redundant, computed fields; fewer small objects)

  • opcodes for immediate values:

    • MAKE_INT creates an int from oparg; for 0-255 this is a sure "integer cache" hit that we can inline
    • LOAD_COMMON_CONSTANT: oparg indexes in a second switch (or array?) with shared immutable common constants, e.g.
      • 0: None
      • 1: False
      • 2: True
      • 3: Ellipsis
      • 4: AssertionError (subsumes LOAD_ASSERTION_ERROR)
      • 5: ''
      • 6: ()
      • 7-11 (or some other range): negative values -1 through -5 (also sure hits in the integer cache)

    Benefit of MAKE_INT and LOAD_COMMON_CONSTANT is that they reduce the size of co_consts (and hence of PYC files) without adding to the size of the instruction array. Downside is that the speed and simplicity of LOAD_CONST is hard to beat, so it will be hard to measure the difference in benchmarks. But None, False, True and small ints make up a lot of the constants (we can easily do research on this).