[Python-Dev] Re: opcode performance measurements

jepler@unpythonic.dhs.org jepler@unpythonic.dhs.org
Thu, 31 Jan 2002 16:54:52 -0600


On Thu, Jan 31, 2002 at 06:02:17AM -0500, Jeremy Hylton wrote:
>   JE> can f not optimize the load of the global g into a
>   JE> LOAD_FAST_GLOBAL?
> 
> So you've got a module with two globals f() and g().  They're stored
> in slots 0 and 1 of the module globals array.  When f() and g() are
> compiled, the symbol table for the module can note the location of f()
> and g() and that f() and g() contain references to globals.  Instead
> of emitting LOAD_GLOBAL "f" in g(), you can emit LOAD_GLOBAL 0 ("f").

But isn't what happens in this module something like
    LOAD_CONST <code1>
    MAKE_FUNCTION 
    STORE_GLOBAL 0 (f)

    LOAD_CONST <code2>
    MAKE_FUNCTION 
    STORE_GLOBAL 1 (g)

so if you convert LOAD_GLOBAL into LOAD_FAST_GLOBAL when you MAKE_FUNCTION
on code1, there is not yet a "g" in the dlict.

Are you populating the "names" part of the dlict as an earlier "pass" of
module compilation, then?  So the optimization doesn't apply if I create
the globals from within a function?  (Of course, in that case it would work
if I set the attributes to 'None' in the module scope, right?):
    def make_fg():
	global f, g
	def f(x): pass
	def g(x): pass

Jeff