Meanwhile Ruby has had MacRuby from Apple, later canceled, but the main developers went out creating RubyMotion.
Sun toyed with JRuby, it was even officially supported on Netbeans, then Red-Hat supported the project for a while. It was also one of the first dynamic languages on GraalVM, with TruffleRuby. GraalPy effort only came a couple of years later, and is still on baby steps.
As of 2025, the refernce implementation counts with YJIT, MJIT, TenderJIT, and MRuby 4 brings ZJIT to the party.
Exchanging Lisp for Python we went backwards in regards to performance in dynamic languages, in a distopian world where C, C++, Fortran libraries are "Python" libraries.
Nope they are bindings, and any language with FFI can have bindings to those same libraries, e.g. PyTorch can also be used in straight C++, or from Java.
There are the IDE integrations as well.
Pity is the lack of (compile ...) and (decompile ....), or similar.
Which by the way is available in Julia.
Parantheses in Lisp are visible, whitespaces in Python, not really.
...Right.
Now the lack of machine code generation for something Lisp was doing in the 1960's, Smalltalk in the 1980's, SELF in 1990's, and having to fall back on C, C++ and Fortran is bonkers.
Thankfully this is finally becoming a priority for those willing to sponsor the effort, and kudos to those making it happen.
I would rather use Common Lisp, in something like Allegro, but I will hardly find such a job, thus only arguing about language features doesn't take us that far.
...
print(container.area)
> AttributeError: 'Container' object has no attribute 'area'. Did you mean: 'inner.area'?[0] -- https://docs.python.org/3.15/whatsnew/3.15.html#improved-err...
Search is limited to 20 attributes and non-descriptors only to avoid arbitrary code execution.
I assume constructing AttributeErrors isn't highly performance sensitive.
> using exceptions for control flow is deprecated?
Exceptions are for the exceptional cases - the ones that mean normal operations are being suspended and error messages are being generated. Don't use them for control flow.In Python, the VM raises a KeyboardInterrupt exception when the user hits ctrl+c in order to unwind the stack, run cleanup code and eventually exit the program.
Python is a quite heavy user of exceptions for control flow.
I really dislike this too, but that’s how it is.
On the other hand it's not like Python really cares about performance....
[heavy green check mark]
try:
data = collection['key']
except KeyError:
data = ..try something else..
[red x] if 'key' in collection:
data = collection['key']
else:
data = ..try something else..
The latter form also has the genuine disadvantage that nothing ensures the two keys are the same. I've seen typos there somewhat often in code reviews.https://realpython.com/python-lbyl-vs-eafp/#errors-and-excep...
for key in possible_keys:
if key in collection:
...
is fine and isn’t subject to your disadvantage. data = collection.get("key")
if data is not None:
...
else:
.... data = collection.get("key")
if data:
...
else:
... missing = object()
data = collection.get("key", missing)
if data is missing:
...
else:
....Nice, not specifying the encoding is one of the most common issues I need to point out in code reviews.
Sigh. Why can't they just be the same in virtual environments. Who cares about lib64 in a venv? Just another useless search path.
Seems to have died the same death as Unladen Swallow, Pyston, etc:
https://discuss.python.org/t/community-stewardship-of-faster...
3.15 has some JIT upgrades that are in-progress. This has a non-exhaustive list of them https://docs.python.org/dev/whatsnew/3.15.html#upgraded-jit-...