本文首发于博客
喜欢科比的球迷应该熟悉这个词,mamba(曼巴)是科比的绰号,同时曼巴也是眼镜蛇的一种,黑曼巴是世界上移动速度最快的蛇。不过这篇文章里的 mamba 和科比没关系和蛇也没啥关系,说的是一个极速版 conda 。
什么是 mamba
conda 国内的各种镜像源最近因为授权的原因纷纷不能用了。当大家都在担忧下载问题的时候,意外发现官方源似乎也没那么糟糕。当然,如果你是一个特别在意速度的人,就会像我的朋友洲更那样把所有 conda 包都下载到本地,然后做一个本地镜像自己用。
其实国外的社交平台一直以来也在吐槽 conda 慢,但这个慢不是下载速度,而是指在下载之前解决软件依赖那几步。conda 在安装许多包或者同时安装多个包的时候速度经常会非常慢。曾经看过一个国外老师发的段子:当我在下课 10 分钟前向学生介绍 conda 优势的时候,我做了一个安装包的演示,现在 20 分钟过去了屏幕上依旧显示 solving environment。
什么事情一旦速度上不去,就总有人受不了。于是,mamba 诞生了,在这个工具的主页上写着这么一句话:
Mamba is a fast cross platform package manager, based on and compatible with conda.
翻译一下,mamba 是一个快速的跨平台包管理工具,基于 conda 且与 conda 完全兼容。所谓基于 conda 就是 conda 能干啥它就干啥,所谓兼容就是 conda 怎么用它就怎么用,而优点就是贼快。
mamba 使用测试
话不多说,先测试起来。
我在 win10 的 Ubuntu 里装了 mamba 进行测试。安装方法有两种,如果你之前没有用过 conda, 和 conda 一样可以通过主页下载一个 shell 脚本进行安装;如果你本身已经安装了 conda,可以直接用 conda-forge 的 channel 进行安装 conda install mamba -c conda-forge
。我使用的是第二种方式。
为了测试速度,在一个新的环境里「假装」安装 snakemake, 使用time
命令检测时间。出现 proceed([y]/n)?
的一瞬间就ctrl+c
结束程序查看运行时间。之所以选择安装 snakemake 是因为我曾经在一台服务器上真实发生过十多分钟都没有解决环境依赖的惨案。
首先用 mamba:
time mamba install snakemake
# 注意,没有迁移难度,conda 怎么用,mamba 就怎么用。
real 0m9.442s
user 0m3.906s
sys 0m2.219s
再来看看使用 conda:
time conda install snakemake
real 1m49.750s
user 1m19.188s
sys 0m2.406s
mamba 用时 10s,conda 用时接近 2 分钟。
速度测试之后再看看兼容性,根据日常使用频率,我分别测试了 install, update, remove, create
都可以正常使用,而且也支持从yml
文件安装。但是有两个常用命令是不支持的 activate, deactivate
,不过提示信息中会告知直接使用 conda 即可
为什么速度变快了
如果你由留意过 conda 安装软件的过程,在开始下载所需要程序之前,会有如下两步:
- collecting package metadata
- solving environment
其实 install 的整体步骤如下图所示,先从你的 channel repodata 中找到你想要的 package,然后再看你要的 package 是否有什么 dependencies。
如下图所示,conda 的牛叉之处在于会根据你系统里已有软件的依赖和要装软件的依赖进行比较,从而选择大家都可以兼容的版本。这也是为什么在安装不同的软件时经常会看到各种包升级降级的问题。
假设你的 foo-lib 有很多版本都符合你的 python 版本,首先 conda 会尝试给你装一个最新版的 foo-lib 3.1 ,但是不巧的是,foo-lib 依赖 bar-lib,这个 bar-lib 又有 20 个版本,foo-lib 3.1 依赖的 bar-lib 可以是 17 以上的版本 。然而你已经装过的 blob-lib 包依赖的 bar-lib 版本最高只能到 16 ,这时 conda 就会给你的 foo-lib 降级,去找一个支持 bar-lib 16 的版本,最后决定给你装一个 foo-lib 3.0。
这个过程我们描述起来比较累,同样 conda 处理起来也没有那么轻松,尤其是当系统里有几百个各种各样软件的时候。
mamba 继承了 conda 的几乎所有内容,除了上面提到的依赖解析这部分。开发者把依赖解析器改成了一个叫做libsolv
的 C 库,来实现之前 conda 对应的功能。这个库已经在很多个 linux 发行版中为系统的包管理器提供了支持。
说道这里可能你也想去试试了。
mamba 主页:https://quantstack.net/mamba.html
mamba github 地址:https://github.com/QuantStack/mamba
最后提醒一下,暂时先不要在任何重要的生产环境中使用 mamba。至于原因,别问,问就是还只是 beta 版。
网友评论