Hacker News
points by hermitdev 2 days ago | 0 comments
> Python is harder to JIT because of the way __dict__ works.

Heh, how about how `__class__` works? Not that I recommend actually doing this, but you can literally change the type of an already instantiated object by reassigning `__class__`:

    >>> class Dog:
    ...     def hi(self):
    ...             print("woof")
    ...
    >>> class Cat:
    ...     def hi(self):
    ...             print("meow")
    ...
    >>> dog = Dog()
    >>> dog.hi()
    woof
    >>> dog.__class__ = Cat
    >>> dog.hi()
    meow
    >>> isinstance(dog, Dog)
    False
    >>> isinstance(dog, Cat)
    True
    >>>
[–] samatman 2 days ago
Lua has the same property with metatables. LuaJIT, which is very fast, has a solution: if you change a metatable after assigning it, or reassign a metatable, Mike Pall turns his back on you. Your code dies slowly, in the outer darkness of the interpreter loop, never to be JIT’ted upon again.
[–] sakesun 2 days ago
I've been doing things in Python for over 20 years. Only recently I learn that I can do this.

    >>> Dog.__bases__ = (Cat,)
    >>> isinstance(dog, Dog)
    True
    >>> isinstance(dog, Cat)
    True
    >>>
[–] pjmlp 1 day ago
Smalltalk, Self, Common Lisp, Ruby as well, no big deal in regards to JIT code.
[–] gregdeon 2 days ago
This is wild. Is it part of Python's specification, or an implementation detail of CPython?
[–] sakesun 2 days ago
As far as I understand, CPython implementation is THE specification. Some billions dollar ERP system firmly rely on this behavior, btw.
[–] gregdeon 1 day ago
Yeah, I was afraid you would say that.
[–] sakesun 1 day ago
Just check with pypy and Graalpy. Both support this as well.
[–] dcrazy 1 day ago
Is the question whether multiple base classes are part of Python’s spec, or if the ability to assign to `__class__` is part of the spec?
[–] esprehn 2 days ago
That's also possible in JS with __proto__. The prototypes of the classes in the chain can be mutated at runtime too. How to handle these cases is well understood for JITs though and python could do the same.

See also the warning here:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...

And this related article:

https://mathiasbynens.be/notes/prototypes

[–] mirashii 2 days ago
The thing that actually makes it harder in Python is threading, because it breaks all ability to reason locally about what might happen and optimize. In Python you have to assume that another thread may do these things at any point mid-execution.
[–] lefra 1 day ago
I see no issue here.

Modifying a variable that is read by another thread needs special care in all multithreaded languages I know. If you don't use a synchronization primitive to tell the other thread "hey, this thing here may have changed, read it again from memory"; the other thread is free to use its old value for as long as it whishes.

[–] pjmlp 2 days ago
Smalltalk, Self and Lisp Machines enter the bar, with live image changes.