[Python-Dev] Re: opcode performance measurements (original) (raw)

Skip Montanaro skip@pobox.com
Thu, 31 Jan 2002 15:16:27 -0600


SP> cases. How does it handle things like
SP> import a.b
SP> use a.b.x

Jeremy> You're a smart guy, can you tell me?  :-).  Seriously, I haven't
Jeremy> gotten that far.

My stuff does handle this, as long as the first name is global. It just gobbles up all LOAD_GLOBALS and any immediately following LOAD_ATTRs. For instance, this trivial function:

def f():
   return distutils.core.setup

compiles to:

  0 LOAD_GLOBAL              0 (distutils)
  3 LOAD_ATTR                1 (core)
  6 LOAD_ATTR                2 (setup)
  9 RETURN_VALUE        
 10 LOAD_CONST               0 (None)
 13 RETURN_VALUE        

My TrackGlobalOptimizer class currently transforms this to

  0 SETUP_FINALLY           11 (to 14)
  3 TRACK_GLOBAL             3 (distutils.core.setup, distutils.core.setup)
  6 POP_BLOCK           
  7 LOAD_CONST               0 (None)
 10 LOAD_FAST                0 (distutils.core.setup)
 13 RETURN_VALUE        

14 UNTRACKGLOBAL 3 (distutils.core.setup, distutils.core.setup) 17 END_FINALLY
18 LOAD_CONST 0 (None) 21 RETURN_VALUE

which is obviously not an improvement because distutils.core.setup is only accessed once. As people make more use of packages, such multiple attribute loads might become more common.

Skip