延迟加载Python模块的最佳实践

时间:2010-11-14 13:47:21

标签: python coding-style

偶尔我想在Python中加载延迟模块。通常因为我想保持运行时间要求或启动时间较低并将代码拆分为子模块会很麻烦。一个典型的用例和我目前首选的实现是:

jinja2 = None

class Handler(...):
    ...
    def render_with_jinja2(self, values, template_name):
        global jinja2
        if not jinja2:
            import jinja2
        env = jinja2.Environment(...)
        ...

我想知道:有没有规范/更好的方法来实现延迟模块加载?

3 个答案:

答案 0 :(得分:53)

您没有理由手动跟踪导入 - 虚拟机维护已导入的模块列表,并且导入该模块的任何后续尝试都会导致在sys.modules中进行快速dict查找而没有其他任何内容。

您的代码和

之间的区别
def render_with_jinja2(self, values, template_name):
    import jinja2
    env = jinja2.Environment(...)

为零 - 当我们点击该代码时,如果尚未导入jinja2,则导入该代码。如果已经存在,则继续执行。

答案 1 :(得分:19)

class Handler(...):
    ...
    def render_with_jinja2(self, values, template_name):
        import jinja2
        env = jinja2.Environment(...)
        ...

无需缓存导入的模块; Python已经做到了。

答案 2 :(得分:9)

其他答案已涵盖实际细节,但如果您 对延迟加载库感兴趣,请查看pypy.test中的apipkg({{ 1}}成名)。