我能否在Python中释放已导入模块以节省内存?

7

我在一个Python程序中导入了一些包。但是其中很多只在程序的开头被调用了一次。这些包会一直保存在内存中,直到整个程序运行结束吗?我可以删除它们来释放内存吗?


你尝试过使用 del 吗? - Igor Rivin
1
正如@IgorRivin所说,使用类似于del np的东西。 - Derek Eden
https://dev59.com/2FwY5IYBdhLWcg3wwqL1 - Pramote Kuacharoen
2
@DerekEden,“del np”不会节省任何内存。这只是摆脱了一个名称——该模块仍然被“sys.modules”引用,可能还被其他模块命名空间中的引用所引用。 - jasonharper
1
看到CPython的内存管理,你应该期望即使你清除了对模块的所有引用,也不会将任何内存交还给操作系统。 - Klaus D.
使用类似 import gc; gc.collect() 的语句可能有助于垃圾回收,但我不确定它是否适用于导入的包。gc — 垃圾回收器接口 - bug_spray
1个回答

2
我认为这是不可能的,即使可能性很小。通过在某个文件的代码中运行“del module”并不能将其从内存中删除:所有已加载的模块都可以从全局的“sys.modules”字典中获取。如果你从“sys.modules”中删除了该模块,那么可以释放一些空间,但我认为Python仍然会保留至少定义在该模块中的类的引用(即使你的代码中没有实例或其他对这些类的引用)。总而言之,大多数模块只能让你回收几千字节的空间。如果要卸载具有多兆字节内存影响的模块(例如Pandas/matplotlib/sqlalchemy),成功的可能性更小,因为这些代码库的复杂性意味着它们具有许多内部交叉引用,你需要从“sys.modules”中删除它们内部导入的所有内容。如果设置基于这样的多兆字节框架,并且你正在运行一个非常有限的系统(如树莓派级别的迷你PC,仅有几MB),那么可以尝试在子进程中执行初始化,并在完成后终止该进程,这将确保释放内存。但除了有限的硬件外,你应该不必担心这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接