2017-02-14 3 views
1

Folgendes findet in einer virtuellen Python 3-Umgebung statt.Warum installiert `pip3 numpy` viel schneller als in` install_requires`?

Ich habe gerade ein kleines Paket geschrieben, das numpy erfordert. Also, in setup.py, schrieb ich install_requires=['numpy']. Ich lief python3 setup.py install, und es dauerte etwa zwei Minuten - ich habe die Vollbild-Dump von Protokollen, Warnungen und Konfigurationen, die normalerweise mit einer nepy Installation kommt.

Dann habe ich eine neue virtuelle Umgebung erstellt, und dieses Mal schrieb einfach pip3 install numpy - die nur ein paar Sekunden dauerte - und dann lief python3 setup.py install, und ich war fast sofort fertig.

Was ist der Unterschied zwischen den beiden und warum war pip3 install numpy so viel schneller? Sollte ich also ein requirements.txt nur einschließen, damit Leute die Anforderungen pip-installieren können anstatt setuptools zu verwenden?


Beachten Sie, dass, wenn ich pip3 install numpy schrieb, bekam ich folgendes:

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

Ist es möglich, dass dies so viel schneller war, weil das numpy Rad wurde bereits zwischengespeichert?

+0

Verwendung von ** im Cache ** numpy? – McGrady

+0

@McGrady Ja, ich nehme an, dass dies das Rad zwischengespeichert hat, nicht die eigentliche Installation. Wenn ich numpy mit setuptools installiere, werden nur ein paar Sekunden für den Download benötigt - der Rest der Zeit wird für die Installation benötigt. – Newb

+0

Wenn Sie versuchen, Ihr Paket in einem neuen Programm zu installieren, ist es jetzt schneller als es das erste Mal war? – Eric

Antwort

2

pip install verwendet wheel Pakete, die teilweise mit dem Ziel der Beschleunigung der Installation entwickelt wurden.

Der Rationale Abschnitt PEP 427, die das wheel Format eingeführt, heißt es:

Python braucht ein Paket-Format, das einfacher zu installieren als Sdist ist. Python sdist Pakete sind definiert und erfordern die distutils und setuptools Build-Systeme, die Ausführung von beliebigem Code zu Build-and-Install, und neu kompilieren, nur so, dass es in eine neue virtualenv installiert werden kann. Dieses System der Zusammenführung von Build-Installation ist langsam, schwer zu halten und behindert die Innovation sowohl bei Build-Systemen als auch bei Installern.

Rad versucht, diese Probleme zu beheben, indem es eine einfachere Schnittstelle zwischen dem Build-System und dem Installer bereitstellt. Das Radbinär Paket-Format befreit Installateure davon, über das Build System Bescheid zu wissen, spart Zeit durch Amortisieren der Kompilierzeit über viele Installationen, und beseitigt die Notwendigkeit, ein Build-System in der Zielumgebung zu installieren.

von einem wheel Installation ist schneller, da es sich um eine Built Distribution format ist:

Built Verteilung

A Verteilung Format-Dateien und Metadaten enthalten, die nur an der richtigen Stelle bewegt werden müssen, Das Zielsystem muss installiert sein. Wheel ist ein solches Format, während distutils Source Distribution nicht ist, da es einen Build-Schritt erfordert, bevor es installiert werden kann.Dieses Format bedeutet nicht, dass Python-Dateien vorkompiliert sein müssen (Wheel enthält absichtlich keine kompilierten Python Dateien).

Seit numpy ‚s Source-Distribution enthält erhebliche Menge an C-Code, dauert es spürbar Zeit kompilieren, die Sie beobachtet, wenn Sie es über nackte setuptools installiert. pip vermied die Kompilierung von C-Code, da das Rad mit binärem Code geliefert wurde (bereits für Ihr System kompiliert).

Verwandte Themen