2017-02-14 1 views
1

В виртуальной среде Python 3 выполняется следующее.Почему `pip3 install numpy` намного быстрее, чем устанавливать его в` install_requires`?

Я только что написал небольшой пакет, который требует numpy. Итак, в setup.py я написал install_requires=['numpy']. Я запустил python3 setup.py install, и потребовалось что-то вроде двух минут - я получил полный экран дампов журналов, предупреждений и конфигураций, которые обычно поставляются с установкой numpy.

Затем я создал новую виртуальную среду, и на этот раз просто написал pip3 install numpy, который занял всего несколько секунд, а затем запустил python3 setup.py install, и я был сделан почти сразу.

В чем разница между двумя, и почему было pip3 install numpy намного быстрее? Должен ли я включать requirements.txt, чтобы люди могли устанавливать требования, а не использовать setuptools?


Обратите внимание, что, когда я писал pip3 install numpy, я получил следующее:

Collecting numpy 
    Using cached numpy-1.12.0-cp36-cp36m-manylinux1_x86_64.whl 
Installing collected packages: numpy 
Successfully installed numpy-1.12.0 

Возможно ли, что это было намного быстрее, потому что NumPy колесо уже в кэше?

+0

Использование ** cached ** numpy? – McGrady

+0

@McGrady Да, я предполагаю, что у этого есть колесо, кэшированное, а не сама установка. Когда я устанавливаю numpy с помощью setuptools, на загрузку затрачивается всего несколько секунд - оставшаяся часть времени тратится на установку. – Newb

+0

Если вы попытаетесь установить свой пакет в новом вену, то теперь он быстрее, чем в первый раз? – Eric

ответ

2

pip install использует пакеты wheel, которые были разработаны частично с целью ускорения процесса установки.

Rationale раздел PEP 427, который ввел формат wheel, гласит:

Python нужен формат пакета, который проще в установке, чем sdist. Пакеты sdist для Python определяются и требуют distutils и setuptools build systems, запускают произвольный код для сборки и установки, и перекомпилируют код, чтобы он мог быть установлен в новый virtualenv. Эта система сборки сборки медленно, трудно до поддерживает и препятствует инновациям как в системах сборки, так и в установщиках.

Wheel пытается устранить эти проблемы, предоставив более простой интерфейс между системой сборки и установщиком. Колесный бинарный формат освобождает установщиков от необходимости знать о системе построения , экономит время, амортизируя время компиляции по многим установкам, и удаляет необходимость установки системы сборки в целевой среде .

Установка с wheel быстрее, так как это Built Distribution format:

Встроенный Распределение

Формат распространения, содержащий файлы и метаданные, которые нужно только переместить в нужное место на целевая система должна быть установлена ​​ . Колесо является таким форматом, в то время как источник Distutil Распространение не является тем, что ему требуется шаг построения, прежде чем он сможет установить .Этот формат не означает, что файлы python должны быть precompiled (Колесо намеренно не включает скомпилированные файлы python ).

Поскольку распределение источника numpy «s содержит значительное количество кода C, компиляцию это занимает заметное время, которое вы наблюдаемые при установке его по голой setuptools. pip избегал компиляции кода C, так как в колесе появился двоичный код (уже скомпилированный для вашей системы).