【问题标题】:When are python imports loaded in memory?python导入何时加载到内存中?
【发布时间】:2021-06-10 08:19:27
【问题描述】:

从之前关于 SO 的问题(如 thisthis)来看,简单的 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 模块加载到内存中?

【问题讨论】:

  • @MisterMiyagi 我期待import django 确实会加载django 中的所有模块。但正如@Ron Serruya 的回答所指出的那样,django init 文件似乎没有加载这些模块,所以现在有意义了。

标签: python import python-import


【解决方案1】:

似乎简单的 import 关键字不做模块的延迟加载。

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

只需尝试以下操作:创建一个文件test.py,只包含print("hey!"),并在同一目录中import .test。您会注意到 import 与仅执行 test.py 中的代码并没有什么不同。

我想了解一个模块何时真正加载到内存中?

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

为什么 import django 命令没有将所有 django 模块加载到内存中?

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

【讨论】:

  • 我明白了。然后,它取决于我正在使用的模块。例如,如果 django 在 import 语句中加载它的所有模块,那么它们就会被加载到内存中。
  • 没错,就是这样。
【解决方案2】:

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)在运行import django时没有得到导入器的原因@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多