[Python-Dev] Accessing globals without dict lookup

Skip Montanaro skip@pobox.com
2002年2月11日 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

AltStyle によって変換されたページ (->オリジナル) /