【问题标题】:How to speed up an already cached pip install?如何加速已经缓存的 pip 安装?
【发布时间】:2012-09-06 17:38:38
【问题描述】:

我经常需要从requirements.txt 重新创建虚拟环境,而我已经在使用$PIP_DOWNLOAD_CACHE。这仍然需要很多时间,我注意到以下几点:

Pip 在以下两行之间花费了大量时间:

Downloading/unpacking SomePackage==1.4 (from -r requirements.txt (line 2))
  Using download cache from $HOME/.pip_download_cache/cached_package.tar.gz

平均大约需要 20 秒来决定是否要使用缓存的包,然后安装速度很快。很多时候你必须安装几十个包(实际上足以写这个问题)。

后台发生了什么? 它们是针对在线包进行某种完整性检查吗?

有没有办法加快速度?

编辑:查看:

time pip install -v Django==1.4

我明白了:

real    1m16.120s
user    0m4.312s
sys     0m1.280s

完整的输出在这里http://pastebin.com/e4Q2B5BA。看起来 pip 正在花时间寻找有效的下载链接,而它已经拥有 http://pypi.python.org/packages/source/D/Django/Django-1.4.tar.gz 的有效缓存。

有没有办法先查找缓存,如果版本匹配就停在那里?

【问题讨论】:

  • 我想知道这是否与问题 #304“安装 -U foo 重新安装 foo 的依赖项,即使它们已经满足”(github.com/pypa/pip/issues/304)有关。这可能完全不相关,但它是另一个奇怪的 PIP 问题。
  • 在这种情况下,我只是在干净的 virtualenv 中安装新包,没有升级。
  • 是的,我只是想建议,因为升级代码会在网络上检查/获取包,即使它确实不应该 - 在“使用缓存”代码中可能有一些东西一样的。
  • 啊,对,是同一种行为。

标签: python virtualenv pip


【解决方案1】:

在花了一些时间研究 pip 内部结构并分析了一些软件包安装后,我得出的结论是,即使有下载缓存,pip 也会对每个软件包执行以下操作:

  • 转到主索引网址,通常是http://pypi.python.org/simple// (example)
  • 跟踪每个链接以获取其他网页
  • 从所有这些页面中提取所有链接
  • 根据包名和版本要求检查所有链接的有效性
  • 从有效链接中选择最新版本

现在 pip 有一个下载 url,如果配置了下载缓存文件夹,则检查下载缓存文件夹,如果存在以该 url 命名的本地文件,最终决定不使用该 url。

我的猜测是,我们可以通过预先检查缓存来节省大量时间,但我对所有 pip 代码库的理解不够好,无法开始进行所需的修改。当然,这仅适用于确切的版本号要求,==,因为在其他限制条件下,例如>=>,我们仍然希望抓取网络以查找最新版本。

尽管如此,我还是制作了一个小的 pull request,如果合并的话,可以为我们节省一些时间。

【讨论】:

  • 还可以看看 devpi,它充当 pypi 的本地代理。使用这样的代理可以避免 pip 进入互联网,并且您可以快速安装!
【解决方案2】:

一种替代方法可能是避免重建 virtualenv,而是获取主虚拟环境的副本,您可以根据需要对其进行更新和复制。

virtualenvwrapper 为使用cpvirtualenv 命令提供了一些支持

【讨论】:

  • 我会补充一点,需要最近安装 virtualenvwrapper(即在此 bugfix 之后)。我的安装日期是 3 月,cpvirtualenv 花了很多时间并且没有保留 --no-site-packages 选项。现在它工作得很好,而且速度很快(几秒钟),当然你手头有一个类似的 virtualenv。
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 2016-05-05
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多