首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >导入包时会发生什么情况?

导入包时会发生什么情况?
EN

Stack Overflow用户
提问于 2013-03-08 03:35:53
回答 1查看 4.2K关注 0票数 19

为了提高效率,我试图弄清楚python是如何使用它的对象堆(和命名空间系统,但它或多或少是清晰的)的。因此,基本上,我试图了解对象何时加载到堆中,其中有多少对象,它们的寿命有多长等。

我的问题是,当我使用一个包并从中导入一些东西时,我的问题是

代码语言:javascript
复制
from pypackage import pymodule

将哪些对象加载到内存( python解释器的对象堆)中?更普遍的是:发生了什么?:)

我猜想上面的例子是这样的:在内存中创建了包pypackage的一些对象(它包含了一些关于包的信息,但不是太多),模块pymodule被加载到内存中,它的引用是在本地名称空间中创建的。这里很重要的一点是:内存中没有创建pypackage的其他模块(或其他对象),除非明确说明(在模块本身中,或者在包初始化技巧和钩子中的某个地方,我不熟悉)。最后,内存中唯一重要的东西是pymodule (即导入模块时创建的所有对象)。是这样吗?如果有人能稍微澄清一下这个问题,我将不胜感激。也许你可以建议一些关于它的有用文章?(文档涵盖了更多特定内容)

我发现了以下关于模块导入的相同问题:

当Python导入一个模块时,它首先检查模块注册表(sys.modules),看看该模块是否已经导入。如果是这种情况,Python将按原样使用现有的模块对象。

否则,Python会执行如下操作:

创建一个新的空模块对象(这本质上是一个编译模块代码对象的dictionary)

  • Insert dictionary

  • Load sys.modules中的模块对象)(如有必要,编译新模块的命名空间中的模块代码对象。所有由代码赋值的变量都可以通过模块对象获得。

如果您能为我们提供关于套餐的同样的解释,我将不胜感激。

顺便说一句,使用包时,模块名称会奇怪地添加到sys.modules中:

代码语言:javascript
复制
>>> import sys
>>> from pypacket import pymodule
>>> "pymodule" in sys.modules.keys()
False
>>> "pypacket" in sys.modules.keys()
True

还有一个关于同一问题的实际问题。

当我构建一组工具时,这些工具可能会在不同的过程和程序中使用。我把它们放在模块里。我别无选择,只能加载一个完整的模块,即使我只想使用其中声明的一个函数。正如我所看到的,可以通过制作小模块并将它们放入包中(如果包在您只导入其中一个模块时没有加载所有模块)来减少这个问题的痛苦。

有没有更好的方法用Python制作这样的库?(只有函数,它们的模块中没有任何依赖项。)是否可以使用C-extensions?

另外,很抱歉问了这么长的问题。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15280157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档