以下内容发生在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轮已经被缓存了吗?
答案 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代码的编译,因为轮子带有二进制代码(已经为你的系统编译)。