Good question - it’s the latter: all the blocks are generated practically instantaneously, whereas it does take a noticeable amount of time for the first block to hit the next one.
if i==25 would only result in the last block falling down, the rest would remain standing.a
Oh that makes sense - apparently bpy.ops has a current context that the transform acts on. Instead could you move the transform call outside of the loop after establishing the first block as the context? That’s how I would instinctively do it, to avoid checking i in every iteration when I know it can only be true once. Totally minor critique lol.