Как ускорить уже кэшированную установку 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 секунд в среднем, чтобы решить, что он будет использовать кэшированный пакет, то установка происходит быстро. Это много времени, когда вам нужно установить десятки пакетов (на самом деле достаточно, чтобы написать это вопрос.)

что происходит на заднем плане? Это что-то вроде проверки целостности онлайн-пакета?

есть ли способ ускорить этот процесс?

edit: посмотреть:

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 ответов


потратив некоторое время на изучение внутренних компонентов pip и профилирование некоторых установок пакетов, я пришел к выводу, что даже с кэшем загрузки pip делает следующее для каждого пакета :

  • перейдите к основному url-адресу индекса, обычно http://pypi.python.org/simple// (пример)
  • следует по каждой ссылке, чтобы получить дополнительные веб-страницы
  • извлекает все ссылки со всех этих страниц
  • проверяет правильность из всех ссылок на имя пакета и требования к версии
  • выбирает самую последнюю версию из допустимых ссылок

Теперь у pip есть url-адрес загрузки, проверяет папку кэша загрузки, если она настроена, и в конечном итоге решает не использовать этот url-адрес, если локальный файл с именем после url-адреса присутствует.

Я предполагаю, что мы могли бы сэкономить много времени, проверив кэш заранее, но у меня нет достаточно хорошего понимания всего кода pip база для запуска необходимых модификаций. Конечно, это будет только для точных требований к номеру версии,==, потому что с другими ограничениями, например >= или >, мы все еще хотим, чтобы ползать в интернете в поисках последней версии.

тем не менее, я смог сделать небольшой pull-запрос который сэкономит нам некоторое время, если объединится.


одна из альтернатив может заключаться в том, чтобы избежать перестройки virtualenv и вместо этого взять копию главной виртуальной среды, которую можно обновить и скопировать по мере необходимости.

virtualenvwrapper обеспечивает некоторую поддержку для этого с cpvirtualenv команда