Also remember that you'll pay a hidden performance cost that the benchmarks don't show for the increased load on the garbage collector.

(I had this exact tradeoff for an application that involved modifying a bytearray to generate animation frames for an LED array... avoiding GC pauses turned out to have a far greater benefit on the overall visual effect than making each frame faster).

(And using things like @micropython.native / @micropython.viper also swung the balance a bit too)