5.3.pip对比conda
了解conda and pip的异同
Conda 和 pip 这两个工具有一些重叠的功能,因此它们常常被认为是没什么区别的,但实际上它们被设计用于不同的目的。pip 是 Python Packaging Authority 推荐的从 Python Package Index (PyPI) 安装包的工具。 pip 可以安装打包为 wheels 格式的包,或者直接从源代码编译安装。从源代码文件安装可能需要系统安装兼容的编译器和相应的库1。
Conda 是跨平台的包和环境管理器,可以安装和管理来自 Anaconda repository 和 Anaconda Cloud 的 conda 包。Conda 包是二进制文件,不需要使用编译器来安装。另外,conda 包不限于 Python包,还可以包含 C 或 C++ 库、R包或任何其他软件。
这是 conda 和 pip 的关键区别。pip 只能安装 Python 包,而 conda 安装的包可以是用任何语言编写的。例如,在使用 pip 之前,必须通过”系统程序管理器“或”下载并运行安装程序“来安装 Python 解释器,而 Conda 可以直接安装 Python 包和 Python 解释器。
这两个工具的另一个显著区别是 conda 可以为不同版本的 python 或 package 创建隔离的环境。这在使用数据科学工具时非常有用,因为不同的工具可能包含冲突的依赖,这可能会导致它们不适合安装到相同的环境中。pip 没有内置的环境管理功能,而是依赖于 virtualenv 或 venv 等其他工具来创建隔离环境。pipenv、poetry、hatch wrap pip、virtualenv 等工具提供了统一的方法来创建单独的环境。
pip 和 conda 在如何实现环境中的依赖关系方面也有所不同。安装包时,pip 会在递归的串行循环中安装依赖项,没有努力确保同时满足所有包的依赖性。如果较早安装的包与稍后安装的包具有不兼容的依赖,环境就会被破坏。相反的,conda 使用一个 satisfiability (SAT) 的处理程序去检查环境中的所有包的依赖是否都得到满足。此检查可能需要额外的时间,但可以防止创建一个被破坏的环境。只要包含依赖关系的 package metadata 是正确的,conda 就可以创建有效的环境。
考虑到 conda 和 pip 之间的相似性,有些人试图将这些工具结合起来创建数据科学环境也就不足为奇了。将 pip 与 conda 结合的主要原因是有些包只能通过 pip 安装。在 Anaconda repository 中有1500多个包可用,其中涵盖了最流行的数据科学、机器学习和AI框架。另外,在 conda-forge 和 bioconda 的 channel 还有数以千计的包可以使用 conda 安装。尽管 Anaconda cloud 有大量的包,但与 PyPI 上可提供的 150,000 多个包相比,数量仍然很少。有时候需要的包没有相应的 conda 包,但在 PyPI 上有安装文件,则可以用 pip 安装。
补充
-
conda 安装包路径是
\Anaconda3\pkgs
-
pip 安装包路径在虚拟环境下是
\Anaconda3\envs\Lib\site-packages
- pip可能会生成存在冲突的环境,而conda不会
- conda不会重复安装已经安装的依赖,默认情况下,pip也如此
- pip安装的包不会显示在anaconda navigation的环境中
- conda 为多个环境安装包时,对于同一个包只安装一次,由conda集中管理
- pip 为多个环境安装包时,因为每个环境安装包使用的pip在不同的路径下,因此会重复安装
关于Python包管理工具的发展历史可以参考Python's New Package Landscape (andrew),其中文翻译版本在这。插图来自https://www.xkcd.com/1987/。
建议使用conda创建和删除Python环境,单独使用pip安装Python Package。原因有如下三点:
随着conda的更新,以下情况有可能改变。
- 混用conda和pip安装package有可能产生冲突。
- 虽然使用conda一般不会产生依赖冲突,但是依然有可能破环Python环境,例如使用conda安装package时,如果不注意,某些依赖项会被自动更新,但这可能会导致项目代码 break down。
- 因为conda不会为不同的环境重复安装相同的package,所以不同环境之间有可能产生冲突(不确定)。
-
编译器和库用于编译源代码。 ↩