Так все байтодрочерство однозначно надо в pack/unpack зафигачивать и в memoryview(bytearray). По большому счету, timeit.timeit много интересных моментов расскажет про скорости выполнения того или иного куска кода.
Писать долго. А тут возможно еще привести в порядок, но скорости конечно не будет. Ускорить можно если написать на Cython основные моменты, но это уже будет не так интересно.

