Each block index could store a C-array of PyObject*, of length equal to the BlockIndex. As tuples are created, they could be stored in this array for re-use later. On cleanup, all these tuples would be decrefed. This would not permit reusing tuples across different BlockIndex, but would permit faster usage on any second access. These would not need to be copied or pickled, so those benefits would remain.
Each block index could store a C-array of PyObject*, of length equal to the BlockIndex. As tuples are created, they could be stored in this array for re-use later. On cleanup, all these tuples would be decrefed. This would not permit reusing tuples across different BlockIndex, but would permit faster usage on any second access. These would not need to be copied or pickled, so those benefits would remain.