如何从模块导入类而不导入整个模块

时间:2020-04-15 14:08:14

标签: python performance memory-management

我有一个非常大的python模块(超过1 GB),并且正在使用另一个from module import class命令从该模块的另一个python脚本中导入一个类。关键是,当我启动python脚本时,内存消耗确实很高,该脚本需要很长时间才能执行(几分钟!)。在那之后启动它时,它会花费更少的时间(几秒钟)并且占用更少的内存,但对我来说仍然很多。

我认为我的脚本所做的是,当我第一次将其加载到内存中时,它将加载模块中的所有数据,这就是为什么要花费这么多时间和内存的原因。

有没有一种方法可以改变这种情况,而不让我的脚本导入整个模块,而只导入我想要的特定部分?

感谢您抽出时间来回答:)

2 个答案:

答案 0 :(得分:0)

简短的回答:不,没有办法避免这种情况。第一次在gien流程中导入模块时,将执行模块的所有顶级语句(import,def,class和课程分配)以构建运行时module对象。这就是Python的工作方式,并且有很充分的理由使它能够那样工作。

现在这里的解决方案非常简单:1 /将巨大的模块拆分为适当的(高内聚性/低耦合)模块,仅导入所需的部分; 2 /而不是在顶层定义千兆字节的数据,通过一些缓存系统将此部分封装在函数中,以避免不必要的重新计算。

答案 1 :(得分:0)

感谢您的回答;)

问题是,我要导入的大模块是通过程序自动生成的(由于我是python的初学者,因此很难修改)。因此,我无法控制它的大小或排列。另外,我想修改它,但是文件太大(超过160万行代码),我无法使用常规API对其进行编辑,这些API仅以“只读”模式打开文件(也许您有建议)这里?) 但是,我听说有一个可行的解决方案,我希望您对此发表意见:如果我在文件末尾使用'if name ='main',并在其中指出所有导入此模块时不使用的类和def,仅在执行时使用。看起来像这样:

class1():
  def __init__():
    # code of the class1

class2():
  def __init__():
    # code of the class2

classn():
  def __init():
    # code of the classn


if __name__ = 'main':
  class1()
  class2()

这样,当我将此模块导入另一个模块时,python将仅从classn()加载def和变量(而不是class1()class2的def和变量),因此占用大量时间加载导入时间更少。 我说得对吗?

谢谢。