Conda 全面讲解——数据科学家的标配工具

18 阅读6分钟

Conda 全面讲解——数据科学家的标配工具

「Python 包管理全攻略」系列第四篇。如果你搞数据科学或者机器学习,Conda 基本是绕不过去的。

Conda 和 pip 有什么不同?

先搞清楚定位:

  • pip 是 Python 的包管理器,只管 Python 包
  • Conda 是跨语言的包管理器 + 环境管理器,它不仅能装 Python 包,还能装 C 库、R 语言包、CUDA 工具包等等

举个实际例子:你想装 PyTorch 的 GPU 版本,用 pip 的话,你还得自己装 CUDA 驱动、cuDNN,搞不好版本对不上。用 Conda 的话,conda install pytorch pytorch-cuda=12.1 -c pytorch -c nvidia 一条命令,CUDA 相关依赖自动帮你装好。

这就是 Conda 在科学计算领域不可替代的原因——它能管理非 Python 的系统级依赖。

安装 Conda

Anaconda vs Miniconda vs Miniforge

这三个东西容易搞混:

工具说明包大小
Anaconda全家桶,预装了几百个数据科学包 + 图形界面~4 GB
Miniconda只有 Conda 和 Python,啥都不预装~100 MB
Miniforge社区维护的 Miniconda 替代品,默认用 conda-forge 源~100 MB

我的建议:

  • 电脑空间够、不想折腾 → Anaconda
  • 想自己控制装什么 → Miniconda 或 Miniforge
  • 公司项目、注意许可证 → 用 Miniforge(Anaconda 的商业使用需要付费许可证,200 人以上的公司要注意)

安装 Miniconda

# Linux
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

# macOS(Apple Silicon)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
bash Miniconda3-latest-MacOSX-arm64.sh

# macOS(Intel)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash Miniconda3-latest-MacOSX-x86_64.sh

安装过程中会问你要不要把 Conda 加到 shell 初始化脚本里,选 yes。装完之后:

# 重新加载 shell 配置
source ~/.bashrc   # 或 source ~/.zshrc

# 验证安装
conda --version

环境管理:Conda 的核心能力

创建环境

# 创建一个叫 data-science 的环境,装 Python 3.11
conda create -n data-science python=3.11

# 创建环境的同时装包
conda create -n ml python=3.11 numpy pandas scikit-learn

-n 后面是环境名称,这个名称是全局的,你在任何目录下都能用这个名字激活环境。不像 venv,每个环境是个文件夹,得记路径。

激活和退出环境

# 激活
conda activate data-science

# 退出
conda deactivate

激活后命令行前面会出现 (data-science),和 venv 类似。

查看所有环境

conda env list
# 或者
conda info --envs

删除环境

conda remove -n data-science --all

克隆环境

conda create -n data-science-backup --clone data-science

做实验之前先克隆一份环境,搞坏了随时恢复,非常实用。

导出和导入环境

# 导出
conda env export > environment.yml

# 导入
conda env create -f environment.yml

# 导入时指定环境名
conda env create -n my-env -f environment.yml

导出的 environment.yml 长这样:

name: data-science
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.11.8
  - numpy=1.26.4
  - pandas=2.2.1
  - pip:
    - some-package-only-on-pypi==1.0.0

注意 pip: 那个部分——如果有些包 Conda 里没有,可以在 yml 里指定用 pip 安装。

包管理

装包

# 基本安装
conda install numpy

# 指定版本
conda install numpy=1.26.4

# 同时装多个
conda install numpy pandas matplotlib

从特定频道装包

conda install -c conda-forge scipy

-c 指定频道(channel),可以理解为不同的软件源。后面详细讲。

更新包

conda update numpy
conda update --all   # 更新所有包(谨慎使用)

卸载包

conda remove numpy

搜索包

conda search tensorflow

这个命令会显示 tensorflow 在所有频道里的所有可用版本,信息很全。

Channel(频道)机制

Channel 是 Conda 独有的概念,相当于软件仓库。

默认频道

defaults    # Anaconda 官方维护

conda-forge:最重要的社区频道

conda-forge 是社区维护的频道,包的数量远超 defaults,更新也更快。很多新包只有在 conda-forge 里才有。

# 临时使用
conda install -c conda-forge some-package

# 永久添加到搜索路径(推荐)
conda config --add channels conda-forge

# 设置 conda-forge 优先级最高
conda config --set channel_priority strict

如果你用 Miniforge,conda-forge 默认就是第一优先级,不用手动配。

频道优先级问题

当同一个包在多个频道里都有时,Conda 按照频道优先级来选。建议设成 strict 模式,避免混用不同频道的包导致依赖冲突:

conda config --set channel_priority strict

Conda 和 pip 混用

这是很多人纠结的问题:Conda 里没有的包,能不能用 pip 装?

能,但有规则:

  1. 先用 Conda 装能装的,再用 pip 装剩下的
  2. 在 Conda 环境里用 pip 没问题,但别在 Conda 环境外用 pip 装包然后指望 Conda 能识别
  3. environment.yml 统一管理,把 pip 的包写在 pip: 下面
dependencies:
  - python=3.11
  - numpy
  - pip:
    - some-obscure-package

最忌讳的操作是: 用 pip 装了一堆包,然后用 Conda 更新其中一个,Conda 不知道 pip 装了啥,可能把依赖搞乱。

Conda 的配置文件

Conda 的全局配置在 ~/.condarc 文件里:

channels:
  - conda-forge
  - defaults
channel_priority: strict
show_channel_urls: true
auto_activate_base: false   # 不想每次开终端都自动激活 base 环境

几个常用配置:

# 不自动激活 base 环境(推荐,避免误操作)
conda config --set auto_activate_base false

# 显示包的频道来源
conda config --set show_channel_urls true

# 查看所有配置
conda config --show

Conda 的常见坑

坑 1:solve environment 卡住不动

Conda 解析依赖关系有时候非常慢,尤其是环境里包很多的时候。

解法:

# 换用 libmamba 解析器(Conda 23.10+ 已内置)
conda config --set solver libmamba

libmamba 是用 C++ 重写的依赖解析器,速度能快几十倍。换完之后 Conda 的体验完全不一样。

坑 2:base 环境越来越臃肿

很多人装什么都往 base 环境里装,时间一长 base 环境里几百个包,慢得要死,还容易冲突。

原则:别动 base 环境。 每个项目建一个新环境,base 环境只用来装 Conda 本身。

坑 3:Conda 和系统 Python 搞混

Conda 装的 Python 和系统的 Python 是独立的。有时候你在 Conda 环境里 pip install 了一个包,但系统 Python 找不到,反之亦然。这是正常的,它们本来就是隔离的。

Conda 的替代方案

如果你觉得 Conda 太慢太重,可以看看:

  • Mamba:Conda 的 C++ 重写版,兼容 Conda 命令,速度快很多。Miniforge 已经默认用 mamba 了
  • Micromamba:Mamba 的纯 C++ 单文件版,连 Python 都不需要就能运行
  • Pixi:新一代包管理器,基于 Conda 生态但更现代

不过大多数情况下,Conda + libmamba solver 已经够用了。

面试题

1. Conda 和 pip 的核心区别是什么?

pip 只管 Python 包,Conda 是跨语言的包管理器,可以管理 Python 包、C/C++ 库、CUDA 工具包等非 Python 依赖。Conda 还自带环境管理功能。在科学计算场景下,很多包依赖复杂的 C 库(如 BLAS、LAPACK、CUDA),Conda 能一并解决,pip 做不到。

2. Anaconda 的商业使用有什么需要注意的?

从 2020 年起,Anaconda 对 200 人以上的商业公司使用 defaults 频道收费。如果你在大公司,建议使用 Miniforge + conda-forge,或者购买 Anaconda 商业许可证。小公司和个人使用不受影响。

3. 为什么 Conda 解析依赖有时候很慢?怎么解决?

Conda 的默认依赖解析器是用 Python 写的,在包多的环境下性能差。解决方案是切换到 libmamba 解析器:conda config --set solver libmamba。libmamba 用 C++ 实现,速度快几十倍。新版 Conda 已经内置了 libmamba。

4. 在 Conda 环境里混用 pip 装包有什么注意事项?

原则是"Conda 优先":先用 Conda 装能装的包,再用 pip 装 Conda 没有的。避免用 pip 安装后再用 Conda 更新同一个包,容易导致依赖不一致。推荐用 environment.yml 统一管理,pip 的包写在 pip: 节下。