2017-02-14 1 views
1

Ce qui suit a lieu dans un environnement virtuel Python 3.Pourquoi `pip3 install numpy` est-il beaucoup plus rapide que de le placer dans` install_requires`?

Je viens d'écrire un petit paquet qui nécessite numpy. Donc, dans setup.py, j'ai écrit install_requires=['numpy']. J'ai exécuté python3 setup.py install et cela a pris deux minutes environ: j'ai récupéré en plein écran les journaux, les avertissements et les configurations qui accompagnent normalement une installation numérique.

Ensuite, j'ai créé un nouvel environnement virtuel, et cette fois-ci, j'ai simplement écrit pip3 install numpy - ce qui n'a pris que quelques secondes - puis j'ai exécuté python3 setup.py install, et j'avais presque terminé.

Quelle est la différence entre les deux, et pourquoi pip3 install numpy était-il tellement plus rapide? Dois-je donc inclure un requirements.txt juste pour que les gens puissent pip-installer les exigences plutôt que d'utiliser setuptools?


Notez que lorsque je l'ai écrit pip3 install numpy, je suis les suivantes:

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

Est-il possible que cela était tellement plus rapide parce que la roue numpy était déjà mis en mémoire cache?

+0

En utilisant ** mis en cache ** numpy? – McGrady

+0

@McGrady Oui, je suppose que cela a la roue en cache, pas l'installation elle-même. Quand j'installe numpy en utilisant setuptools, quelques secondes seulement sont consacrées au téléchargement - le reste du temps est consacré à l'installation. – Newb

+0

Si vous essayez d'installer votre paquet dans un nouveau venv, est-il maintenant plus rapide que c'était la première fois? – Eric

Répondre

2

pip install utilise wheel paquets, qui ont été conçus en partie dans le but d'accélérer le processus d'installation.

La section Rationale de PEP 427, qui a introduit le format wheel, déclare:

Python a besoin d'un format de package qui est plus facile à installer que sdist. Les paquets sdist de Python sont définis par et nécessitent les systèmes de construction distutils et setuptools, exécutant du code arbitraire pour construire et installer, et recompilent, code juste pour pouvoir être installé dans un nouveau virtualenv . Ce système de fusion de build-install est lent, difficile à maintenir et entrave l'innovation tant dans les systèmes de construction que dans les installateurs.

La roue tente de remédier à ces problèmes en fournissant une interface plus simple entre le système de construction et l'installateur. Le format binaire roue libère les installateurs d'avoir à connaître le système construction, gagne du temps en amorti temps de compilation sur de nombreuses installations, et supprime le besoin d'installer un système de construction dans l'environnement cible .

Installation d'un wheel est plus rapide car il est un Built Distribution format:

distribution Construit

Un format de distribution contenant des fichiers et des métadonnées qui ne doivent être déplacés à l'emplacement correct sur le système cible doit être installé. La roue est un tel format, alors que la distribution de distutil ne l'est pas, en ce sens qu'elle nécessite une étape de construction avant de pouvoir être installée.Ce format n'implique pas que les fichiers python doivent être précompilés (Wheel n'inclut pas intentionnellement les fichiers compilés python ).

Depuis la distribution source de numpy contient une quantité importante de code C, la compilation il faut du temps notable, que vous avez observé lors de l'installation via nue setuptools. pip a évité la compilation du code C puisque la roue est livrée avec du code binaire (déjà compilé pour votre système).