纯python标准库模块(如pathlib、itertools、datetime、collections、json、urllib.parse)可通过from...import真正减重;而pandas等重型模块因__init__.py含全量初始化逻辑,仅from pandas import dataframe仍会加载全部依赖。

直接用 from module import name 语法,但必须清楚它不总是“只导入函数”——很多重型模块(如 pandas、numpy)在子模块或 __init__.py 中已触发全量初始化,光写 from pandas import DataFrame 并不能跳过底层 C 扩展加载。
哪些模块能靠 from ... import 真正减重?
纯 Python 模块(如 pathlib、dataclasses、itertools)基本可以。它们的 __init__.py 很轻,from itertools import chain 确实只加载 chain 对象本身,不碰其他几十个工具函数。
-
from datetime import datetime, timedelta:安全,datetime模块本身无副作用 -
from collections import defaultdict, Counter:没问题,collections是标准库中极轻的模块 -
from json import loads, dumps:有效,避免了导入整个json模块及其编码器/解码器类 -
from urllib.parse import urlparse, quote:推荐,urllib子模块拆分清晰,按需导入不拖累
为什么 from pandas import DataFrame 还是慢?
因为 pandas 的 __init__.py 一被触达就执行大量初始化:注册访问器、加载 IO 引擎、预编译正则、甚至尝试导入 numpy 和 pytz。哪怕你只写了一行 from pandas import DataFrame,Python 仍会完整执行 pandas/__init__.py。
- 验证方法:运行
python -X importtime -c "from pandas import DataFrame" 2>&1 | head -20,能看到大量子模块加载日志 - 真正起效的是函数内导入:
def process(): import pandas as pd; return pd.DataFrame(...) - 若必须顶层写
from,优先选更细粒度子模块,比如from pandas.core.frame import DataFrame(但风险高,内部路径不稳定)
替代方案:用 importlib.import_module 绕过 __init__.py
当你要加载的函数/类藏在深层子模块里,且该子模块不依赖上层 __init__.py 的副作用时,importlib.import_module 可跳过包初始化流程。
-
df_mod = importlib.import_module("pandas.core.frame")→ 直接拿到DataFrame类,不触发pandas/__init__.py - 但注意:
pandas.core.frame内部仍会导入numpy,所以只是“延迟”而非“免除”重型依赖 - 必须手动缓存结果,否则每次调用都重复查找:
_df_mod = None; def get_df(): global _df_mod; if _df_mod is None: _df_mod = importlib.import_module(...); return _df_mod.DataFrame
最易忽略的一点:类型注解会强制提前加载。写 def f() -> pd.DataFrame: 就等于在模块加载阶段执行 import pandas,哪怕函数从未被调用。此时唯一解是启用 from __future__ import annotations,把所有注解转为字符串延迟解析。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











