[Python-Dev] Dynamic module namspaces

Andrew Bennetts andrew-pythondev at puzzling.org
Mon Jul 17 10:57:15 CEST 2006


On Sun, Jul 16, 2006 at 11:52:48PM -0700, Josiah Carlson wrote:
> Andrew Bennetts <andrew-pythondev at puzzling.org> wrote:
[...]
> > 
> > Have you seen the "demandload" hack that Mercurial uses?  You can find it here:
> >     http://selenic.com/repo/hg?f=cb4715847a81;file=mercurial/demandload.py
> > 
> > You can see an example use of it here:
> >     http://selenic.com/repo/hg?f=d276571f2c4b;file=mercurial/commands.py
> 
> The problem with that particular method is that it requires that you use
> a string to describe the set of modules you would like to import, rather
> than a name.

I agree, it's ugly.  I'd like there to be a nicer solution.

> In the py3k mailing list I recently described a mechanism (though not
> implementation) for a somewhat related method to support automatic
> reloading when a file has changed (for things like web frameworks), but
> by removing that file change check, you get the equivalent to what you
> describe, though you don't need to use strings, you can use names...
> 
>     from dynamicreload import DR
> 
> and used like...
> 
>     DR.os.path.join(...)
> 
> As long as you use the DR.-prefixed name, you get automatic reloading 
> (if desired) on access.

Aside from also being ugly in its own way, a magic prefix like this would add a
small performance penalty to places that use it.  I believe demandload has the
nice feature that once a demandloaded object is accessed, it is replaced with
the actual object rather than the demandload gunk, so there's only a one-off
performance penalty.

> > The advantage for an interactive command line tool isn't so much memory
> > consumption as speed.  Why waste hundreds of milliseconds importing code that
> > isn't used?  There's an experimental branch to use the same demandload code in
> > bzr, the reported results are "400ms for 'bzr rocks' down to 100ms, 'bzr root'
> > from 400ms => 200ms, etc." (according to
> > http://permalink.gmane.org/gmane.comp.version-control.bazaar-ng.general/13967)
> > 
> > Over half the runtime wasted on importing unused code!  There's a definite need
> > for a nice solution to this, and it should be included in the standard
> > batteries that come with Python.
> 
> Well, just starting up Python without loading any modules can be time
> consuming; perhaps even dwarfing the few hundred ms saved by dynamic
> loading.

Well, it's only about 10ms on my laptop running Ubuntu (it varies up to 90ms,
but I expect that's just noise), and the "-S" switch makes no obvious difference
(tested with "python -c ''").  10ms overhead to start python I can live with.
It takes about that long run "svn --version".

> > If we can address related problems at the same time, like emitting deprecation
> > warnings for accessing certain module attributes, then even better!
> 
> __deprecated__ = ['name1', ...]
> 
> Make your dynamic load/reload aware of the __deprecated__ attribute, and
> you are done.

I'm fine with that syntax.  But regardless of how it's spelled, I'd really like
the standard library or interpreter to have support for it, rather than having a
non-standard 3rd-party system for it.  I want there to "be one-- and preferably
only one --obvious way to do it".

-Andrew.



More information about the Python-Dev mailing list