I think your slice math might be wrong:
[register * 2:(register * 2)+3]
This doesn't look right to me.. again not entirely sure of your intentions. But I can tell you, this is not the reason why your code is running slower. I just ran this in interactive iPython:
Nope, you were correct; that IS the reason my code was running slower!
It needs to be
[register * 2:(register * 2)+4]
You need to slice
past the last item you want.
Doing
test[0:3] = bytearray(struct.pack(">f", 123.456 ))
tries to put a FOUR byte float into the first THREE positions, well it does put it into the first four positions, but what was the old fourth byte gets shoved to the right and retained.
My code was working because I do these writes in sequence, so the rogue bytes got overwritten.
Oh well, I learned a lot about debugging, and my shitty code is now all running fine.
I promise my next script will be much neater!