【问题标题】:Python Modules: When one imports them, do they go into memory?Python 模块:当导入它们时,它们会进入内存吗?
【发布时间】:2011-11-14 10:28:54
【问题描述】:

我刚刚完成了this 初学者在 python 中创建和导入模块的练习。

我想知道模块中的所有内容是否都导入到计算机的内存中?

随着代码变长和导入的模块越来越多,以后是否会对内存产生影响?

因此,我是否需要了解内存管理才能编写资源高效的代码?

【问题讨论】:

    标签: python python-module


    【解决方案1】:

    您的模块会自动编译(.pyc 文件),然后将其导入内存,但您不必担心内存不足:模块非常小;一次加载数千个模块是很常见的!

    您无需了解内存管理,因为 Python 会为您完成所有工作。

    编辑:您还可以在每个模块本身中编写大量代码和模块文档(您应该阅读docstrings here),而不会增加模块的大小或速度加载,因为编译步骤会删除所有不必要的文本、cmets 等。

    【讨论】:

    • 不错。我在 20 年后再次学习编码,回到我的时代,内存管理很重要!man voice>
    • 我现在明白你为什么要使用第二人生化身作为你的形象了;)祝你好运;你会发现 Python 很有趣!
    • 哈哈哈。实际上,我有一个需要与我的第二人生角色相关联的工作博客,我使用该图像注册了 gravatar。现在,我无法摆脱它。大声笑这是我:twitter.com/#!/Dorje
    • 编译步骤不会删除文档字符串,只会删除 cmets,除非您使用 -OO 启动 Python,而您可能不应该这样做。
    【解决方案2】:

    是和不是。

    是的,模块确实会导入到计算机内存中,但是不,您不应该因此而编写资源节约型代码。 Python 模块非常小(几 KiB,在极少数情况下几 MiB),对内存使用没有显着影响。

    【讨论】:

      【解决方案3】:

      我只能想象一种方法可以滥用导入来泄漏内存;您可以动态地创建和导入任意名称的模块(例如,为了创建插件系统);使用它们一次并停止使用它们。如果您通过正常的导入机制执行此操作,即使用__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'] 是否足以“取消导入”此类动态生成的模块?
      • @Remi:这是必要的,但在一般情况下实际上还不够,因为对模块的其他引用可能会出现。链接文章中对这种模式的外观进行了更详细的描述。
      • 除了您自己定义的变量之外,任何特定的“幕后”引用是否存在风险?想一想,即使您将使用相同的名称重新生成一个模块 n 次,并每次使用 reload() 导入它,您也必须注意引用先前模块版本中某些内容的变量。
      • 感谢您提供有关 pyunit 方法的链接。但据我了解,rollback-importer 也没有解决这个参考问题,或者是吗?
      • 没有一种解决方案可以释放任意模块。一个模块可能会调用logging.getLogger(__name__),因此还有另一个可能的泄漏(虽然很小),并且可能还有其他示例。我试图说得有点含糊,因为我认为这首先不是一个好的模式。一个长时间运行的进程不应该做这种事情。回滚导入器主要用于测试和开发,而对实际生产系统的用处要小得多。
      猜你喜欢
      • 2011-04-16
      • 2010-11-18
      • 2021-03-30
      • 2020-06-06
      • 2011-06-26
      • 2017-03-21
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多