python 导入何时加载到内存中?

When are python imports loaded in memory?

从早期关于 SO 的问题,如 this and ,似乎简单的 import 关键字不会延迟加载模块。但是,当我 运行 一个简单的测试来检查 import 语句前后的内存使用情况时 - 似乎某些模块确实是延迟加载的。

示例:

>>> import django

>>> from django.http import HttpResponse

内存使用(第一个free命令在第一次导入后为运行,第二个free命令在第二次导入后为运行):

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3935        1773         399           0        1762        1889

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3935        1787         386           0        1762        1875

注意已用内存从 1773MB 增加到 1787MB。

我想了解模块何时真正加载到内存中?为什么 import django 命令没有加载内存中的所有 Django 模块?

it seems that the simple import keyword does not do lazy loading of modules.

应该怎么办? import 必须保证导入文件/模块中的代码 __init__.py 在导入时执行。

只需尝试以下操作:制作一个文件 test.py,只包含 print("hey!"),并且在同一目录中 import .test。您会注意到 import 实际上与仅执行 test.py.

中的代码没有什么不同

I am trying to understand when does a module actually get loaded in memory?

import name实际上只是在name命名空间下执行当前命名空间中的指定代码。如果您在该代码中定义了一个 class,那么它立即可见,必须进行解析,诸如此类。

And why does an import django command not load all of django modules in memory?

因为在 import django 上执行的代码根本不会那样做。 (就像它没有起来给我们做当之无愧的咖啡一样!)

import some_pgk 所做的是 运行 some_pkg.__init__ 文件

这是 django 的初始化文件

from django.utils.version import get_version

VERSION = (4, 0, 0, 'alpha', 0)

__version__ = get_version(VERSION)


def setup(set_prefix=True):
    ...
    ...

如你所见,它并没有做太多,它只设置了版本,这就是为什么其他模块(例如 django.http)在 运行ning import django