I started programming in Rust several years ago, and it has gradually changed the way I design programs in other programming languages, most notably in Python. Before I started using Rust, I was usually writing Python code in a very dynamic and type-loose way, without type hints, passing and returning dictionaries everywhere, and occasionally falling back to “stringly-typed” interfaces. However, after experiencing the strictness of the Rust type system, and noticing all the problems that it prevents “by construction”, I suddenly became quite anxious whenever I got back to Python and wasn’t provided with the same guarantees.
Python has gotten faster, but it’s still nowhere near what you expect from traditional compiled languages. It can’t be.
The trick to writing performant Python code is to get good (native) libraries and let it handle the heavy lifting.
For performance sensitive stuff, the fact that pure Python is very slow really matters. For stuff that’s not performance sensitive (that is, 99% of the code out there) it doesn’t really matter, but even then it’s better to be fast than to be slow.
Now this is not something I would ordinarily have a problem with. I use Python for a reason and it’s not performance. But if I end up writing Python like it’s rust, I might as well do rust and reap the (massive!!!) performance and memory profile benefits too while I’m at it.
Python3.10 was ~27x slower than Compiled C++ in this benchmark. Python 3.11 dropped that down to 17x just out of the box. Additionally, you can always write a python module in C or C++ to get the benefits of compilation. With the maintainability and flexibility of python.