2017-02-14 58 views
1

以下內容發生在Python 3虛擬環境中。爲什麼`pip3安裝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

使用**緩存** numpy? – McGrady

+0

@McGrady是的,我假設這有輪子緩存,而不是實際的安裝本身。當我使用setuptools安裝numpy時,只需花費幾秒鐘的時間下載 - 剩下的時間用於安裝。 – Newb

+0

如果你嘗試在新的venv中安裝你的軟件包,它現在比第一次更快嗎? – Eric

回答

2

pip install使用wheel包,它們的設計部分是爲了加快安裝過程。

Rationale部的PEP 427,其引入的wheel格式,規定:

的Python需要更易於安裝比sdist一個包的格式。 Python的sdist包由setuptools和setuptools構建系統定義,並且需要運行任意代碼來構建和安裝, 和重新編譯,代碼只是爲了能夠將其安裝到新的 virtualenv中。這種合併構建安裝的系統很慢,難以維護,並阻礙了構建系統和安裝程序的創新。

輪試圖通過提供構建系統和安裝程序之間的簡單 接口來解決這些問題。二進制 封裝格式使安裝人員不必瞭解系統構建版本,通過在許多安裝中分攤編譯時間來節省時間,並且不需要在目標環境中安裝構建系統。

wheel安裝更快,因爲它是一個Built Distribution format

內置分佈

包含文件和元數據只需要在移動到正確的位置的分佈格式目標系統,安裝爲 。 Wheel就是這樣一種格式,而distutil的源碼不是,它需要一個構建步驟才能安裝 。這種格式並不意味着python文件必須預編譯爲 (Wheel有意不包含編譯的python 文件)。

由於numpy的源分佈包含的C代碼顯著量,編譯它需要明顯的時間,當通過裸setuptools安裝了它你觀察。 pip避免了C代碼的編譯,因爲輪子帶有二進制代碼(已經爲您的系統編譯)。

相關問題