venv只能基于系统已安装的Python版本创建虚拟环境,不负责安装新版本;而conda可自动下载并配置指定版本的Python解释器,并预装二进制依赖。

venv 只能用系统已有的 Python 版本
你执行 python -m venv myenv 时,用的是当前终端里 python 命令指向的那个解释器。如果系统没装 Python 3.11,你就没法用 venv 创建 3.11 环境——它不负责安装 Python,只负责“打包隔离”。
而 conda 的 conda create -n myenv python=3.11 会自动下载、解压并配置好对应版本的 Python 解释器,哪怕你本地根本没装过 3.11。
常见错误现象:CommandNotFoundError: 'python=3.11' is not a conda package 这类报错通常是因为 channel 没配全,不是 Python 版本本身不存在。
conda 能装非 Python 的二进制依赖,venv 不能
venv 启动后只能靠 pip 装包,遇到需要编译的包(比如 pyarrow、GDAL、带 CUDA 的 torch),你得自己装系统级依赖(build-essential、libssl-dev、nvidia-cuda-toolkit 等),还可能卡在编译失败上。
conda 直接提供预编译好的二进制包,连同 MKL、OpenSSL、CUDA 驱动运行时一起装进环境,conda install pytorch 一行就搞定。
关键差异点:
• venv + pip:依赖解析强,但对 C/C++ 编译链敏感
• conda:依赖解析基于整个环境快照,更“粗粒度”,但省去大量系统适配工作
• 混用风险:在 conda 环境里用 pip install 容易破坏 conda 的依赖一致性,尤其当 pip 覆盖了 conda 安装的底层库时
venv 环境默认绑定项目目录,conda 环境默认集中管理
venv 创建的 myenv/ 就在你当前项目文件夹里,激活脚本路径是相对的:source ./myenv/bin/activate。换目录或删项目,这个环境基本就废了。
conda 默认把所有环境放在统一位置(如 ~/miniconda3/envs/myenv),你在任何路径下都能 conda activate myenv,多个项目可共享同一个环境,也方便备份整个 envs/ 目录。
实际影响:
• 团队协作时,venv 要求每个成员都在项目根目录操作,CI/CD 流水线需显式 cd 到项目路径
• conda 环境名全局唯一,conda env export > environment.yml 导出的文件可跨平台复现,但要注意 channel 来源(defaults vs conda-forge)
磁盘占用和启动速度差异很实在
一个空的 venv 环境约 20–30 MB,创建耗时不到 1 秒;conda 的最小环境(只含 Python 解释器)也要 300 MB 起,首次创建常需 10–30 秒,尤其在国内网络下下载慢。
这不是“功能多就该慢”的借口,而是设计取舍:
• venv 不复制标准库,只做符号链接或硬链接,轻量但受限于宿主 Python
• conda 复制完整 Python 运行时+常用工具链(curl、git、gcc 等),为的是彻底脱离系统环境
容易被忽略的一点:conda 环境一旦创建,即使你后续只用其中 10% 的包,那 300 MB 也一直占着;venv 虽小,但如果你在里头 pip install tensorflow,体积照样暴涨——隔离机制不等于体积控制。
立即学习“Python免费学习笔记(深入)”;



















