从源代码生成

本文概述了从源代码构建numpy,并分别给出了具体平台的详细说明。

先决条件

构建numpy需要安装以下软件:

  1. Python 3.6.x或更新版本

    请注意,Python开发头也需要安装,例如,在Debian/Ubuntu上需要同时安装这两个头 python3python3-dev . 在Windows和macOS上,这通常不是问题。

  2. 编译程序

    要为Python构建任何扩展模块,您需要一个C编译器。各种numpy模块使用Fortran 77库,因此您还需要安装Fortran 77编译器。

    注意,NumPy主要使用GNU编译器开发,并在MSVC和Clang编译器上进行了测试。来自其他供应商的编译器,如Intel、Absolft、Sun、NAG、Compaq、Vast、Portland、Lahey、HP、IBM等,仅以社区反馈的形式提供支持,可能无法开箱即用。建议使用GCC4.x(及更高版本)编译器。在ARM64(aarch64)上,建议使用GCC 8.x(及更高版本)。

  3. 线性代数库

    NumPy不需要安装任何外部线性代数库。但是,如果这些可用,NumPy的安装脚本可以检测它们并使用它们进行构建。可以使用许多不同的LAPACK库设置,包括优化的LAPACK库,如OpenBLAS或MKL。这些库的选择和位置以及包含路径和其他此类生成选项可以在 site.cfg 位于NumPy根存储库或 .numpy-site.cfg 主目录中的文件。看到了吗 site.cfg.example 示例文件包含在NumPy存储库或sdist中用于文档,下面用于指定环境变量的搜索优先级。

  4. 赛隆

    对于构建NumPy,您需要最新版本的Cython。

基本安装

要安装NumPy,请运行:

pip install .

要执行可从源文件夹运行的就地生成,请运行:

python setup.py build_ext --inplace

注意:有关对numpy本身进行开发工作的构建说明,请参见 设置和使用开发环境 .

测试

确保测试你的构建。为确保一切正常,请查看是否所有测试都通过:

$ python runtests.py -v -m full

有关测试的详细信息,请参阅 测试生成 .

并行构建

可以使用以下对象进行并行构建:

python setup.py build -j 4 install --prefix $HOME/.local

这将在4个CPU上编译numpy并将其安装到指定的前缀中。要执行并行就地生成,请运行:

python setup.py build_ext --inplace -j 4

还可以通过环境变量指定生成作业的数量。 NPY_NUM_BUILD_JOBS .

选择Fortran编译器

编译器是自动检测的;可以使用 --fcompiler . E、 g.选择gfortran::

python setup.py build --fcompiler=gnu95

有关详细信息,请参阅:

python setup.py build --help-fcompiler

如何检查BLAS/LAPACK库的ABI

检查用于构建库的编译器的一种相对简单且可靠的方法是在库上使用ldd。如果libg2c.so是一个依赖项,这意味着已经使用了g77(注意:g77不再支持构建NumPy)。如果libgfortran.so公司是一个依赖项,使用了gfortran。如果两者都是依赖项,这意味着两者都被使用了,这几乎总是一个非常糟糕的主意。

加速BLAS/LAPACK库

NumPy搜索优化的线性代数库,如BLAS和LAPACK。搜索这些库有特定的顺序,如下和中所述 site.cfg.example 文件。

BLAS

库的默认顺序为:

  1. MKL

  2. BLIS

  3. OpenBLAS公司

  4. ATLAS

  5. BLAS(网络库)

如果您希望基于OpenBLAS进行构建,但也有可用的BLIS,则可以通过环境变量预定义搜索顺序 NPY_BLAS_ORDER 这是一个逗号分隔的列表,上面的名称用于确定要搜索的内容,例如:

NPY_BLAS_ORDER=ATLAS,blis,openblas,MKL python setup.py build

将更喜欢使用阿特拉斯,然后BLIS,然后OpenBLAS和作为最后手段MKL。如果两者都不存在,构建将失败(名称以小写形式进行比较)。

或者可以使用 !^ 要否定所有项:

NPY_BLAS_ORDER='^blas,atlas' python setup.py build

允许使用任何东西 but NetLIB BLAS和ATLAS库,保留上述列表的顺序。

否定与肯定不能混用,也不能有多个否定,这样会产生错误。

LAPACK

库的默认顺序为:

  1. MKL

  2. OpenBLAS公司

  3. 烈焰

  4. ATLAS

  5. LAPACK(网络库)

如果您希望基于OpenBLAS进行构建,但也有MKL可用,则可以通过环境变量预定义搜索顺序 NPY_LAPACK_ORDER 这是一个以逗号分隔的上述名称列表,例如:

NPY_LAPACK_ORDER=ATLAS,openblas,MKL python setup.py build

将更喜欢使用ATLAS,然后OpenBLAS和作为最后手段MKL。如果两者都不存在,构建将失败(名称以小写形式进行比较)。

或者可以使用 !^ 要否定所有项:

NPY_LAPACK_ORDER='^lapack' python setup.py build

允许使用任何东西 but 在NetLIB LAPACK库中,保留上述列表的顺序。

否定与肯定不能混用,也不能有多个否定,这样会产生错误。

1.20 版后已移除: macOS上的本机库由Accelerate提供,不适合在NumPy中使用,因为它们有bug,在容易复制的条件下会导致错误的输出。如果供应商修复了这些bug,则可以恢复库,但在此之前,为自己编译的用户应该使用另一个线性代数库或使用内置(但速度较慢)默认值,请参阅下一节。

禁用Atlas和其他加速库

可以通过以下方式禁用Numpy中的Atlas和其他加速库:

NPY_BLAS_ORDER= NPY_LAPACK_ORDER= python setup.py build

或:

BLAS=None LAPACK=None ATLAS=None python setup.py build

64位BLAS和LAPACK

通过设置环境变量,可以告诉Numpy使用64位BLAS/LAPACK库:

NPY_USE_BLAS_ILP64=1

在建造Numpy的时候。支持以下64位BLAS/LAPACK库:

  1. OpenBLAS ILP64与 64_ 符号后缀 (openblas64_

  2. 不带符号后缀的OpenBLAS ILP64 (openblas_ilp64

它们的优先顺序取决于 NPY_BLAS_ILP64_ORDERNPY_LAPACK_ILP64_ORDER 环境变量。默认值为 openblas64_,openblas_ilp64 .

注解

在同时使用32位BLAS/LAPACK的程序中使用非符号后缀64位BLAS/LAPACK,在某些情况下(例如,在Linux上使用嵌入式Python解释器)会导致崩溃。

64位OpenBLAS 64_ 符号后缀是通过使用以下设置编译OpenBLAS获得的:

make INTERFACE64=1 SYMBOLSUFFIX=64_

符号后缀可避免32位和64位BLAS/LAPACK库之间的符号名称冲突。

提供其他编译器标志

通过设置 OPTFOPT (对于Fortran),以及 CC 环境变量。当提供可以提高代码性能的选项时,请确保 -DNDEBUG 这样就不会执行调试代码。