You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python导入模块工作机制探究:sys模块加载实验疑问

Python模块导入与内存加载的疑问与实验分析

有说法称执行Python文件时,首先导入的模块会被加载并执行。针对这个说法,我做了两组对比实验:

实验一:导入模块但未实际使用其功能

代码如下:

import tracemalloc,sys
 
def app():
    a = input()
# starting the monitoring
tracemalloc.start()
 
app()
 
print(tracemalloc.get_traced_memory())
 
tracemalloc.stop()

输出结果为(64, 72),且导入sys与未导入sys时的内存占用一致。

实验二:导入模块并实际调用其功能

修改代码为使用sys.stdin.readline()接收输入,代码如下:

import tracemalloc,sys
 
def app():
    a = sys.stdin.readline()
# starting the monitoring
tracemalloc.start()
 
app()
 
print(tracemalloc.get_traced_memory())
 
tracemalloc.stop()

此时内存占用大幅增加,输出为(51, 12661),说明sys模块相关内容已加载到内存中。

疑问

Python作为解释型语言,能否提前预知是否会使用sys模块?sys模块是否像dll一样仅在使用时才加载?或是“Python文件执行时先加载执行导入模块”的说法有误?

解答

首先明确:import语句执行时,模块就已经被加载并执行了,但这里的“加载”有两层含义:

  1. 模块的字节码会被加载到内存,模块顶层代码会被执行(比如模块里的全局变量定义、函数定义等)
  2. 模块内部的一些子模块、依赖资源,可能会采用延迟加载的策略——也就是只有当实际访问这些子属性时,才会进一步加载对应的内容。

回到实验细节:

  • 实验一中,import sys仅加载了sys模块的核心框架(比如模块对象本身、顶层基础属性),但sys.stdin这类子对象对应的底层资源并未完全初始化或加载;而input()是独立的内置函数,不需要依赖sys模块的这部分资源,所以内存占用和不导入sys时一致。
  • 实验二中,调用sys.stdin.readline()时,Python需要初始化sys.stdin对应的IO流对象,这会触发底层更多资源的分配(比如缓冲区、关联的系统IO句柄等),因此内存占用大幅上升。

另外,Python作为解释型语言,并不会提前预知代码中是否会使用模块的某个属性,它只会在执行到import语句时加载模块的核心部分,后续当访问模块的具体属性时,再按需加载对应的子资源。

所以“Python文件执行时先加载执行导入模块”的说法没错,但要注意:模块的完整加载(包括所有子资源)不一定在import阶段完成,部分内容会延迟到实际使用时才加载。

内容的提问来源于stack exchange,提问作者helloworld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:15:57