【问题标题】:can I release an imported package to save memory in python?我可以发布一个导入的包以在 python 中节省内存吗?
【发布时间】:2020-10-20 07:33:44
【问题描述】:

我在 python 程序中导入了一些包。但是其中很多只在程序过程开始时被调用。这些包是否保存在内存中,直到整个程序完成运行?调用释放内存后可以删除吗?

【问题讨论】:

  • 你试过del吗?
  • 正如@IgorRivin 所说,使用类似del np
  • @DerekEden, del np 不会节省任何内存。这只去掉了一个名字——这个模块仍然被sys.modules引用,也可能被其他模块的命名空间引用。
  • 看到 CPython 的内存管理,您应该期望即使您清除所有对模块的引用,也不会将内存交还给操作系统。

标签: python python-import python-internals


【解决方案1】:

我不认为这是可能的 - 但即使是这样,通过擦除加载的模块获得的内存通常也是最小的。

在某个文件的代码中运行del module不会将其从内存中删除:所有加载的模块都可以从全局sys.modules 字典中获得。如果您从 sys.modules 中删除模块,您可以获得一些空间,但我认为 Python 仍将至少保留对模块中定义的类的引用(即使您没有这些类的实例或其他引用)代码中的类。)

总而言之,大多数模块可以让您返回几千字节。如果您计划“卸载”对内存有数兆字节影响的模块(想想 Pandas/matplotlib/sqlalchemy),您将更不可能成功,因为这些代码库的复杂性意味着它们有很多内部交叉引用,您需要删除它们从 sys.modules 内部导入的所有内容。

如果设置基于像这样的多兆字节框架,并且您在非常有限的系统(例如,树莓级迷你 PC,只有几 MB)上运行,您可以尝试在子进程中执行初始化,并在完成后终止该进程 - 这将为您提供一些保证内存被释放的保证。但是除了有限的硬件之外,您根本不应该为此烦恼。

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2011-10-03
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2011-05-05
    • 2021-08-14
    相关资源
    最近更新 更多