(original) (raw)



On Mon, 2 Oct 2017 at 08:00 Christian Heimes <christian@python.org> wrote:
On 2017-10-02 15:26, Victor Stinner wrote:
\> 2017-10-02 13:10 GMT+02:00 INADA Naoki <songofacandy@gmail.com>:
\>> https://github.com/python/cpython/pull/3796
\>> In this PR, lazy loading only happens when uuid1 is used.
\>> But uuid1 is very uncommon for nowdays.
\>
\> Antoine Pitrou added a new C extension \_uuid which is imported as soon
\> as uuid(.py) is imported. On Linux at least, the main "overhead" is
\> still done on "import uuid". But Antoine change optimized a lot
\> "import uuid" import time!
\>
\>> https://github.com/python/cpython/pull/3757
\>> In this PR, singledispatch is lazy loading types and weakref.
\>> But singledispatch is used as decorator.
\>> So if web application uses singledispatch, it's loaded before preforking.
\>
\> While "import module" is fast, maybe we should use sometimes a global
\> variable to cache the import.
\>
\> module = None
\> def func():
\> global module
\> if module is None: import module
\> ...
\>
\> I'm not sure that it's possible to write an helper for such pattern.

I would rather like to see a function in importlib that handles deferred
imports:

modulename = importlib.deferred\_import('modulename')

def deferred\_import(name):
if name in sys.modules:
\# special case 'None' here
return sys.modules\[name\]
else:
return ModuleProxy(name)

ModuleProxy is a module type subclass that loads the module on demand.

My current design for an opt-in lazy importing setup includes an explicit function for importlib that's mainly targeted for the stdlib and it's startup module needs, but could be used by others: https://notebooks.azure.com/Brett/libraries/di2Btqj7zSI/html/Lazy%20importing.ipynb .