为什么`pip3安装numpy`比在`install_requires`中设置它快得多?

时间:2017-02-14 10:55:49

标签: python python-3.x numpy pip setuptools

以下内容发生在Python 3虚拟环境中。

我刚刚撰写了一个需要numpy的小程序包。所以,在setup.py中,我写了install_requires=['numpy']。我跑了python3 setup.py install,花了两分钟时间 - 我得到了日志,警告和配置的全屏转储,通常是安装不正常。

然后,我创建了一个新的虚拟环境,这次只写了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轮已经被缓存了吗?

1 个答案:

答案 0 :(得分:2)

pip install使用wheel个软件包,其设计部分旨在加快安装过程。

引入wheel格式的Rationale PEP 427部分声明:

  

Python需要一种比sdist更容易安装的包格式。   Python的sdist包由distutils定义并且需要distutils和   setuptools构建系统,运行任意代码来构建和安装,   并重新编译,代码只是为了它可以安装到一个新的   virtualenv中。这种混合构建安装的系统很慢,很难   维护并阻碍构建系统和安装程序的创新。

     

Wheel试图通过提供更简单的方法来解决这些问题   构建系统和安装程序之间的接口。轮二进制   包格式使安装程序不必了解构建   系统,通过在许多安装上分摊编译时间来节省时间,   并且无需在目标中安装构建系统   环境。

wheel开始安装速度更快,因为它是Built Distribution format

  

内置分发

     

包含文件和元数据的分发格式,只需将其移动到目标系统上的正确位置即可   安装。轮是这样的格式,而distutil的源   分发不是,因为它需要一个构建步骤才可以   安装。这种格式并不意味着python文件必须是   预编译(Wheel故意不包括编译的python   文件)。

由于numpy的源代码分发包含大量的C代码,因此编译它需要花费大量时间,这是您通过裸setuptools安装时所观察到的。 pip避免了C代码的编译,因为轮子带有二进制代码(已经为你的系统编译)。