5 ms·
In Python, “Inline caching has been a huge success” [0]. I believe quickening has been proposed as part of a plan for further speed improvements [1]. [0] https
by pansa2 6y ago
In Python, “Inline caching has been a huge success” [0]. I believe quickening has been proposed as part of a plan for further speed improvements [1].
[0] https://mobile.twitter.com/raymondh/status/1357478486647005187 https://mobile.twitter.com/raymondh/status/13574784866470051...
[1] https://github.com/markshannon/faster-cpython/blob/master/plan.md https://github.com/markshannon/faster-cpython/blob/master/pl...
- chrisseaton 6y agoWere Python calls uncached before this month? That seems extraordinary and the world's lowest hanging fruit and I'm amazed nobody ever picked it. Dropbox had a whole team working on a Python JIT and didn't try that first?
- pansa2 6y agoI’m afraid I don’t know the details. However, this post seems relevant - someone who worked on the JIT at Dropbox describes how expensive function calls in CPython can be: https://blog.kevmod.com/2020/05/python-performance-its-not-just-the-interpreter/ https://blog.kevmod.com/2020/05/python-performance-its-not-j...
- jhayward 6y agoThe Python core developers have been working on caching in the interpreter for close to a decade[1]. They're very conservative, though, both about making the interpreter more complex as well as ensuring that nothing regresses in performance unless absolutely necessary to fix something broken. So I wouldn't exactly describe it as "low hanging fruit" [1] https://bugs.python.org/issue14757 https://bugs.python.org/issue14757
- vlovich123 6y agoTo my eye the follow up comments seem to imply it’s specifically for dict objects? > Methods already has their own fast path, so this is just for reading attributes from instances with __dict__. If __slots__ are defined, there is an addtional 35% improvement. But clearly it’s beyond just that: > Also, imports are now faster for modules that have type annotations. The annotations are initially loaded as strings and only evaluated later if needed. The only downside is that it easy to forget to make the relevant typing imports.
- Doxin 6y agoby far most python objects use the __dict__ mechanism, not just dicts. For example: >>> class MyFoo: ... pass ... >>> foo=MyFoo() >>> foo.bar='baz' >>> foo.__dict__ {'bar': 'baz'} >>> foo.__dict__['bar']=42 >>> foo.bar 42 __slots__ is an alternative in case your object has a fixed number of member variables. It's mostly a memory optimization: >>> class MyFoo: ... __slots__=['bar'] ... >>> f=MyFoo() >>> f.bar='baz' >>> f.__dict__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyFoo' object has no attribute '__dict__' Some types of objects have neither, these tend to be builtins or objects implemented using the C API: >>> foo = int() >>> foo.__dict__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'int' object has no attribute '__dict__' >>> foo.__slots__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'int' object has no attribute '__slots__'
- vlovich123 6y agoThanks for the clarification. I always wished Python would make it easier somehow to auto-detect the slots from the constructor. I don’t think it’s just a memory optimization though since they mention access of when slots is defined things are faster and benefit more from this optimization.