[Python-Dev] Accessing globals without dict lookup
Skip Montanaro
skip@pobox.com
Mon, 11 Feb 2002 08:16:32 -0600
Tim> [Skip Montanaro, on
Tim> def mylen(s):
Tim> return len(s)
Tim> ]
>> Yeah, it's
>>
>> TRACK_GLOBAL 'len'
>> LOAD_FAST <len>
>> LOAD_FAST <s>
>> CALL_FUNCTION 1
>> UNTRACK_GLOBAL 'len'
>> RETURN_VALUE
>>
>> or something similar. (Stuff in <...> represent array indexes.)
>>
>> My scheme makes update of my local copy of __builtins__.len
Tim> Who is the "me" in "my"?
Sorry, should have been "the" instead of "my". TRACK_GLOBAL is responsible
for making the original copy. I should have added another argument to it:
TRACK_GLOBAL 'len', <len>
LOAD_FAST <len>
LOAD_FAST <s>
CALL_FUNCTION 1
UNTRACK_GLOBAL 'len', <len>
RETURN_VALUE
Tim> You mean number of accesses to len per function call, I think.
Yes.
Tim> If I do
Tim> for i in xrange(1000000):
Tim> print mylen("abc")
Tim> I'm going to do a TRACK_GLOBAL and UNTRACK_GLOBAL thingie too for
Tim> each LOAD_FAST of len, and then the average time per len lookup
Tim> really has to count the average time for those guys too.
Actually, no. I originally meant to say "Ignoring the fact that my
optimizer would leave this example untouched...", but deleted it while
editing the message as more detail than you were asking for. Your example:
def mylen(s):
return len(s)
doesn't access len in a loop, so it would be ignored. On the other hand:
for i in xrange(1000000):
print mylen("abc")
would track mylen (but not xrange).
Skip