- Simplifies and improves the performance of deployment: it becomes a straightforward case of copying code files
- Largely achieves the same stated goal of Java: write once, run anywhere
- Allows for easy code inspection and debugging in production (it's debatable whether that's a good thing; I think it is, overall)
Take all benchmarking with a pinch of salt, but see some stats here: https://suade.org/dev/12-requests-per-second-with-python/#th...
The pure python MySQL drivers were marginally slower for cpython.
The native drivers worked fine with pypy, but pypy didn’t give any real performance gains as the program spent all its time in the native code
Then when testing pure python drivers we found pypy made the whole program massively faster.
The programs were ETLs that are generating big REPLACE INTO statements.
Different databases and drivers do prepared statements in different ways. Postgres, for example, can receive the statement and the parameters and do the interpolation in the server. The params still need to be serial used by the client and the template isn’t reused, so it’s no big perf win.
MySQL, on the other hand, needs the driver to do the interpolation. The server only knows how to execute sql strings.
It turns out it is far better to prepare the sql in pure python where pypy knows all about types etc than to have the c MySQL driver do it.
Exactly the same thing plays out in java. The MySQL java drivers are staggeringly inefficient at large prepared statements, and in my profiling massive amounts of time is spent in java functions in the MySQL driver that are trying to work out where the next question-mark is. Sadly the drivers are the poo they are. Iirc the mariadb java drivers are rather more optimized.
I would argue a speedup (though maybe not a “massive” one) from pure python over a native extension is not that surprising, specifically because of (2), which makes it possible for the runtime-extension interface overhead to be more significant than (1). Native extensions tend to give a speed boost for computationally intensive tasks, but can’t really wait any faster, and aren’t free of overhead.