【问题标题】:Organize heavy python imports组织大量 python 导入
【发布时间】:2011-01-07 23:25:46
【问题描述】:

我的代码中大约 25% 依赖于模块:Traits、tvtk 等,这些模块导入起来非常繁重。在我的机器上通常需要 2 秒钟的时间(在其他机器上需要更多时间)。

我的模块组织如下

mainmodule
|--submodule1
|--submodule2
   |--subsubmodule1
   |--subsubmodule2
|--submodule3
|--submodule4
   |--subsubmodule1
   |--subsubmodule2

其中,submodule1 和 submodule2 使用 Traits。这意味着 75% 的情况下,如果我调用 import mainmodule,我将不得不等待重模块被导入,但随后它们将不会被使用。

如何组织导入以缩短导入时间?

也许有办法做这样的事情:

import mainmodule

并且拥有

mainmodule
|--submodule3
|--submodule4
   |--subsubmodule1
   |--subsubmodule2

并且只调用:

import mainmodule.heavy

拥有一切

【问题讨论】:

  • 什么?非常不清楚你在问什么。
  • 回答一个不同的问题:您可以尝试将特征等放在一个 zip 文件中,然后将该 zip 文件放在 PYTHONPATH 上。这可能会减少整体导入时间,因为文件访问次数要少得多。
  • @Falmarri:我更新了问题,希望意图更清楚; @Andrew Dalke:我怎么知道哪个文件是 Traits 的一部分?

标签: python import project-organization


【解决方案1】:

听起来您想要的是一种方法,以便导入 mainmodule 不会自动导入 submodule1submodule2,这需要很长时间才能加载。

实际上,这很容易。您只能在需要它们的函数中导入submodule1submodule2。或者将这些函数移到一个名为 mainmodule_heavy.py 的单独模块中。

(或者你可以hack the Python module system to load modules lazily。但这种黑客往往会导致问题,而且这听起来对你的情况来说是不必要的。)

【讨论】:

    【解决方案2】:

    你可以把一些这样的代码放在一个函数/模块中:-

    def heavy():
        global x
        global y
        import x, y
    
    def mainmodule():
        if heavy not in globals():
            import heavy
    

    实际上,这在同一个程序中是行不通的,因为无法导入函数。此外,您需要检查全局变量中的 string,而不是模块本身。所以,改为:-

    def heavy():
        global x
        global y
        import x, y
    
    def mainmodule():
        if 'x' not in globals() or 'y' not in globals():
            heavy()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2021-07-07
      • 2013-06-12
      • 1970-01-01
      相关资源
      最近更新 更多