【发布时间】:2011-11-14 10:28:54
【问题描述】:
我刚刚完成了this 初学者在 python 中创建和导入模块的练习。
我想知道模块中的所有内容是否都导入到计算机的内存中?
随着代码变长和导入的模块越来越多,以后是否会对内存产生影响?
因此,我是否需要了解内存管理才能编写资源高效的代码?
【问题讨论】:
标签: python python-module
我刚刚完成了this 初学者在 python 中创建和导入模块的练习。
我想知道模块中的所有内容是否都导入到计算机的内存中?
随着代码变长和导入的模块越来越多,以后是否会对内存产生影响?
因此,我是否需要了解内存管理才能编写资源高效的代码?
【问题讨论】:
标签: python python-module
您的模块会自动编译(.pyc 文件),然后将其导入内存,但您不必担心内存不足:模块非常小;一次加载数千个模块是很常见的!
您无需了解内存管理,因为 Python 会为您完成所有工作。
编辑:您还可以在每个模块本身中编写大量代码和模块文档(您应该阅读docstrings here),而不会增加模块的大小或速度加载,因为编译步骤会删除所有不必要的文本、cmets 等。
【讨论】:
是和不是。
是的,模块确实会导入到计算机内存中,但是不,您不应该因此而编写资源节约型代码。 Python 模块非常小(几 KiB,在极少数情况下几 MiB),对内存使用没有显着影响。
【讨论】:
我只能想象一种方法可以滥用导入来泄漏内存;您可以动态地创建和导入任意名称的模块(例如,为了创建插件系统);使用它们一次并停止使用它们。如果您通过正常的导入机制执行此操作,即使用__import__(variable_module_name),这些模块将被添加到sys.modules,即使它们不会被进一步使用。
解决方案很好,不要那样做。如果你真的在创建一个插件系统,那么这种动态导入可能没问题,因为插件会被重用。如果您确实需要使用动态生成的单次使用代码;使用eval。
如果您真的非常需要对动态生成的代码使用导入(例如,用于自动化测试),那么您可能确实需要在sys.modules 中查找以删除您导入的模块。 Here's a nice article explaining how to do something like that.
【讨论】:
del sys.modules['mymodule'] 是否足以“取消导入”此类动态生成的模块?
logging.getLogger(__name__),因此还有另一个可能的泄漏(虽然很小),并且可能还有其他示例。我试图说得有点含糊,因为我认为这首先不是一个好的模式。一个长时间运行的进程不应该做这种事情。回滚导入器主要用于测试和开发,而对实际生产系统的用处要小得多。