[Python-Dev] Can LOAD_GLOBAL be optimized to a simple array lookup?
Alex Martelli
aleaxit at gmail.com
Thu Aug 24 00:39:43 CEST 2006
On Aug 23, 2006, at 2:22 PM, K.S.Sreeram wrote:
> Hi all,
>
> I noticed in Python/ceval.c that LOAD_GLOBAL uses a dictionary lookup,
> and was wondering if that can be optimized to a simple array lookup.
>
> If i'm right there are 3 kinds of name lookups: locals, outer
> scopes(closures), and globals. (not counting attribute lookup). Locals
> are identified by, either the presence of assignments, or their
> presence
> in the arg list. So all name lookups can be classified into the 3
> types
> at compile/load time.
>
> Since we know, at load time, which names are global.. Can't we simply
> build a global name table and replace LOAD_GLOBALs with a lookup at
> the
> corresponding index into the global name table?
At the time the function's body gets compiled, the global (or
builtin) it's trying to access might or might not be there -- as long
as it gets added afterwards, before the function's body gets
_executed_, no problem (in today's scheme). It's not obvious to me
how you could compile a ``corresponding index'' into the LOAD_GLOBAL
opcode, since that index is in general unknown at compile time.
> The module's dict object will need to be special so that whenever a
> name
> gets 'set', the global name table should get updated.
It seems that you'd need to chase down and modify all of the
LOAD_GLOBAL opcodes too, at every such modification. (the concept
of modifying builtins becomes extremely scary...). Considering the
amortized speed of a dict lookup for an interned string (hash value
cached and thus immediately available, equality comparison with other
interned string a single machine-level operation), it's not clear to
me that the huge complexity (and potential performance impact) of all
this could ever possibly be justified.
A change in Python semantics allowing some level of "nailing down" of
builtins (and perhaps globals too) *COULD* easily yield large
performance benefits, but that's a subject for the Python-3000
mailing list; as long as builtins and globals stay as fluid as today,
I'm skeptical on the optimization opportunities here.
Alex
More information about the Python-Dev
mailing list