为了效率起见,我试图弄清楚 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抱歉这么长的问题。