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

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

bash 复制代码
# 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。装完之后:

bash 复制代码
# 重新加载 shell 配置
source ~/.bashrc   # 或 source ~/.zshrc

# 验证安装
conda --version

环境管理:Conda 的核心能力

创建环境

bash 复制代码
# 创建一个叫 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,每个环境是个文件夹,得记路径。

激活和退出环境

bash 复制代码
# 激活
conda activate data-science

# 退出
conda deactivate

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

查看所有环境

bash 复制代码
conda env list
# 或者
conda info --envs

删除环境

bash 复制代码
conda remove -n data-science --all

克隆环境

bash 复制代码
conda create -n data-science-backup --clone data-science

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

导出和导入环境

bash 复制代码
# 导出
conda env export > environment.yml

# 导入
conda env create -f environment.yml

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

导出的 environment.yml 长这样:

yaml 复制代码
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 安装。

包管理

装包

bash 复制代码
# 基本安装
conda install numpy

# 指定版本
conda install numpy=1.26.4

# 同时装多个
conda install numpy pandas matplotlib

从特定频道装包

bash 复制代码
conda install -c conda-forge scipy

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

更新包

bash 复制代码
conda update numpy
conda update --all   # 更新所有包(谨慎使用)

卸载包

bash 复制代码
conda remove numpy

搜索包

bash 复制代码
conda search tensorflow

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

Channel(频道)机制

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

默认频道

bash 复制代码
defaults    # Anaconda 官方维护

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

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

bash 复制代码
# 临时使用
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 模式,避免混用不同频道的包导致依赖冲突:

bash 复制代码
conda config --set channel_priority strict

Conda 和 pip 混用

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

能,但有规则:

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

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

Conda 的配置文件

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

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

几个常用配置:

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

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

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

Conda 的常见坑

坑 1:solve environment 卡住不动

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

解法:

bash 复制代码
# 换用 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: 节下。


相关推荐
深度先生5 小时前
虚拟环境:别让包打架
python
漠效6 小时前
随机代理‌IP访问脚本
开发语言·python
SilentSamsara6 小时前
元类与 __init_subclass__:类是如何被“创建“出来的
开发语言·python·青少年编程
隔壁大炮6 小时前
MNE-Python 第6天学习笔记:分段(Epoching)与基线校正
python·eeg·mne·脑电数据处理
SilentSamsara6 小时前
concurrent.futures 实战:进程池与线程池的统一抽象
运维·开发语言·python·青少年编程
水木流年追梦7 小时前
大模型入门-大模型的推理策略
开发语言·python·算法·正则表达式·prompt
Cthy_hy7 小时前
Python 算法竞赛:数学核心知识点全总结
python·算法
独隅7 小时前
DeepSpeed ZeRO-3在TensorFlow中缺失的底层支持机制与优化全面指南
人工智能·python·tensorflow
松☆7 小时前
昇腾NPU上的张量操作库,和PyTorch的张量操作有啥不一样?
人工智能·pytorch·python