Memory issues in Python often come down to object lifecycle, not the language itself. Unbuffered reads are nasty because you're materializing everything in memory before the GC can touch it. Your Rust rewrite probably helps mainly by forcing explicit resource management, not inherent speed.
That said, you could've fixed the original with generators and proper streaming. But yeah, shipping a single binary with predictable memory is a real win operationally. No runtime surprises on customer machines.