9

我经常需要从 a 重新创建虚拟环境,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的有效缓存。

有没有办法先查找缓存并在版本匹配时停在那里?

4

2 回答 2

8

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

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

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

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

尽管如此,我还是能够提出一个小的拉取请求,如果合并,这将为我们节省一些时间。

于 2012-09-14T19:39:24.897 回答
3

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

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

于 2012-09-15T10:36:17.413 回答