【问题标题】:How to import a class from a module without importing the whole module如何从模块中导入类而不导入整个模块
【发布时间】:2020-04-15 14:08:14
【问题描述】:
我有一个非常大的 python 模块(超过 1 GB),我正在使用命令from module import class 在另一个 python 脚本中从该模块导入一个类。问题是,当我首次启动我的 python 脚本时,内存消耗非常高,脚本需要很长时间才能执行(几分钟!)。之后启动它时,它花费的时间明显减少(几秒钟)并且使用的内存更少,但对我来说仍然很多。
我认为我的脚本所做的是,当我第一次将模块启动到内存中时,它会从模块加载所有数据,这就是为什么它需要这么多时间和内存的原因。
有没有办法改变这一点,而不是让我的脚本导入整个模块,而只导入我想要的特定部分?
感谢您花时间回答:)
【问题讨论】:
标签:
python
performance
memory-management
【解决方案1】:
简短回答:不,没有办法避免这种情况。第一次在 gien 进程中导入模块时,它的所有顶级语句(导入、定义、类,当然还有赋值)都会执行以构建运行时 module 对象。这就是 Python 的工作方式,它有充分的理由让它这样工作。
现在这里的解决方案非常简单:1/ 将您的巨大模块拆分为适当的(高内聚/低耦合)模块,并且只导入您需要的部分,以及 2/ 而不是在顶层定义千兆字节的数据,用一些缓存系统将这部分封装在函数中,以避免无用的重新计算。
【解决方案2】:
感谢您的回答;)
问题是,我正在导入的大模块是通过程序自动生成的(我会发现很难修改,因为我是 python 的初学者)。所以我无法控制它的大小或排列。另外,我想修改它,但文件太大(超过 160 万行代码)我无法使用仅以“只读”模式打开文件的常规 API 编辑它(也许你有一个建议这里?)
但是,我听说过一个可行的解决方案,我想听听您对此的看法:如果我在文件末尾使用:'if name = 'main'' 并指出所有导入此模块时我不会使用但仅在执行它时才使用的类和定义。它看起来像这样:
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() 的定义和变量(而不是来自class1() 或class2 的那些),因此加载导入的时间显着减少.
我说的对吗?
谢谢。