我有一个非常大的python模块(超过1 GB),并且正在使用另一个from module import class
命令从该模块的另一个python脚本中导入一个类。关键是,当我启动python脚本时,内存消耗确实很高,该脚本需要很长时间才能执行(几分钟!)。在那之后启动它时,它会花费更少的时间(几秒钟)并且占用更少的内存,但对我来说仍然很多。
我认为我的脚本所做的是,当我第一次将其加载到内存中时,它将加载模块中的所有数据,这就是为什么要花费这么多时间和内存的原因。
有没有一种方法可以改变这种情况,而不让我的脚本导入整个模块,而只导入我想要的特定部分?
感谢您抽出时间来回答:)
答案 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和变量),因此占用大量时间加载导入时间更少。
我说得对吗?
谢谢。