代码之家  ›  专栏  ›  技术社区  ›  JimB

当模块被多次导入时,python会优化它们吗?

  •  40
  • JimB  · 技术社区  · 17 年前

    如果代码的某个子模块加载了一个大模块,那么从该名称空间引用该模块而不是再次导入它有什么好处吗?

    我有一个模块MyLib,它广泛使用ReallyBigLib。如果我有导入MyLib的代码,我应该像这样把模块挖出来吗

    import MyLib
    ReallyBigLib = MyLib.SomeModule.ReallyBigLib
    

    或者只是

    import MyLib
    import ReallyBigLib
    
    6 回复  |  直到 13 年前
        1
  •  82
  •   Matt Razza    11 年前

    Python模块可以被视为单例。。。无论您导入它们多少次,它们只初始化一次,因此最好执行以下操作:

    import MyLib
    import ReallyBigLib
    

    进口声明的相关文件:

    https://docs.python.org/2/reference/simple_stmts.html#the-import-statement

    sys.modules :

    这是一个将模块名称映射到已加载模块的字典。这可以被操纵来强制重新加载模块和其他技巧。请注意,从该字典中删除模块与对相应的模块对象调用reload()不同。

        2
  •  40
  •   Charles Merriam    17 年前

    正如其他人所指出的,Python维护一个已导入的所有模块的内部列表。首次导入模块时,模块(脚本)将在其自己的命名空间中执行,直到最后,内部列表将更新,并且在import语句之后继续执行。

    请尝试以下代码:

       # module/file a.py
       print "Hello from a.py!"
       import b
    
       # module/file b.py
       print "Hello from b.py!"
       import a
    

    没有循环:只有缓存查找。

    >>> import b
    Hello from b.py!
    Hello from a.py!
    >>> import a
    >>>
    

    Python的一个优点是,一切都可以在名称空间中执行脚本。

        3
  •  8
  •   Federico A. Ramponi    17 年前

        4
  •  8
  •   Munhitsu    16 年前

    警告:Python不保证模块不会被初始化两次。 http://code.djangoproject.com/ticket/8193

        5
  •  3
  •   babbageclunk    17 年前

    导入模块的内部注册表是 sys.modules 字典,它将模块名称映射到模块对象。您可以在那里查看当前导入的所有模块。

    -例如,将您自己的对象添加为伪模块,其他模块可以导入这些伪模块。

        6
  •  2
  •   Marko    17 年前

    推荐文章