[Python-ideas] __builtins__ behavior and... the FUTURE!
Neil Toronto
ntoronto at cs.byu.edu
Mon Nov 26 21:50:53 CET 2007
Guido van Rossum wrote:
> The semantics of __builtins__ are an implementation detail used for
> sandboxing, and assignment to __builtins__ is not supported. Alas, I
> can't quite figure out what you're after; your post doesn't start with
> a clear problem statement, so I'm not even sure if this is helpful
> information. I just hope to encourage you from trying to change the
> semantics of __builtins__. In 3.0, __builtins__ may well be renamed.
Sorry - it was very early in the morning when I did my analysis, so I
wasn't as clear as I could have been. I had two points:
1. A suggestion for future builtins, which is probably the wrong thing
to do. Please disregard this.
2. A question about which semantics fast globals should support, and how
different they can be from the current semantics and still be acceptable.
I have two problems with the current semantics:
1. They seem very wrong to me, even for an implementation detail. Python
developers rely on function behavior being invariant to the call site.
(As much as Python developers could be said to rely on any invariance,
anyway.)
2. Implementing the current semantics with fast globals seems
unnecessary. It no longer helps performance (it hurts it a tiny bit),
and the code that does it reads like a pasted-on hack.
I've since discovered that it wouldn't be much slower. Here are some
times for one of my "builtins get" benchmarks:
Current builtins: 3.11 sec
Fast builtins, immediate semantics: 1.81 sec
Fast builtins, current or pre-1998: 1.64 sec (+ epsilon for hack)
"Immediate" semantics (which I find most correct) are a little slower
because it has to check whether __builtins__ has changed every time a
globals lookup fails, before it does a builtins lookup. In "pre-1998"
semantics, a change of __builtins__ is checked only with a new stack frame.
Besides those results, fast globals reduces function call overhead by
10%. I haven't measured what effect the hack has on that.
Personally, I like fast globals with pre-1998 semantics best, though
there's still a difference in meaning between script and interactive
mode. I can do it that way, the current way, or the immediate way. Or I
could make current vs. pre-1998 selectable by macro. Do you have a
preference?
I swear, though, I'm nearly ready to post a patch. :)
Neil
More information about the Python-ideas
mailing list