【发布时间】:2013-02-23 04:20:09
【问题描述】:
为了提高效率,我试图弄清楚 python 如何使用它的对象堆(和命名空间系统,但它或多或少很清楚)。所以,基本上,我试图了解对象何时加载到堆中,其中有多少,它们的寿命等。
我的问题是当我使用一个包并从中导入一些东西时:
from pypackage import pymodule
哪些对象被加载到内存中(到 python 解释器的对象堆中)?更一般地说:会发生什么? :)
我猜上面的例子是这样的:
在内存中创建了包pypackage 的一些对象(其中包含有关包的一些信息但不是太多),模块pymodule 被加载到内存中,并且它的引用是在本地名称空间中创建的。 这里重要的是:没有在内存中创建 pypackage 的其他模块(或其他对象),除非明确说明(在模块本身中,或在包初始化技巧中的某处和钩子,我不熟悉)。最后,内存中唯一的一件大事是pymodule(即导入模块时创建的所有对象)。是这样吗?如果有人能稍微澄清一下这个问题,我将不胜感激。也许你可以建议一些有用的文章? (文档涵盖了更具体的内容)
我发现以下关于模块导入的相同问题:
当 Python 导入一个模块时,它首先检查模块注册表 (sys.modules) 以查看该模块是否已经导入。如果是这种情况,Python 会按原样使用现有的模块对象。
否则,Python 会这样做:
- 创建一个新的空模块对象(这本质上是一个字典)
- 将该模块对象插入到 sys.modules 字典中
- 加载模块代码对象(必要时先编译模块)
- 在新模块的命名空间中执行模块代码对象。代码分配的所有变量都可以通过模块对象获得。
如果对包有同样的解释,将不胜感激。
顺便说一句,奇怪的是,对于包,模块名称被添加到 sys.modules 中:
>>> import sys
>>> from pypacket import pymodule
>>> "pymodule" in sys.modules.keys()
False
>>> "pypacket" in sys.modules.keys()
True
还有一个关于同一问题的实际问题。
当我构建一组工具时,可能会在不同的流程和程序中使用这些工具。我把它们放在模块中。我别无选择,只能加载一个完整的模块,即使我只想使用在那里声明的一个函数。正如我所见,可以通过制作小模块并将它们放入一个包中来减轻这个问题的痛苦(如果一个包在您只导入其中一个模块时没有加载它的所有模块)。
有没有更好的方法在 Python 中制作这样的库? (仅使用函数,它们的模块中没有任何依赖关系。)C 扩展是否可能?
PS 抱歉这么长的问题。
【问题讨论】:
标签: python memory-management heap-memory