如何加快已经缓存的pip安装速度?

时间:2012-09-13 15:17:21

标签: python virtualenv pip

我经常需要从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的有效缓存。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

我的猜测是我们可以通过预先检查缓存来节省大量时间,但我对所有pip代码库没有足够的理解来启动所需的修改。当然,它只适用于确切的版本号要求==,因为对于其他约束,例如>=>,我们仍然希望抓取网络以查找最新版本。< / p>

然而,我能够制作一个小pull request,如果合并,我们可以节省一些时间。

答案 1 :(得分:2)

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

virtualenvwrapper为使用cpvirtualenv命令

执行此操作提供了一些支持