Numba 仓库地图
Numba 仓库相当庞大,由于其历史悠久,功能分散在许多位置。为了帮助开发者理清头绪,本文将尝试总结不同类别功能所在的位置。
支持文件
构建和打包
setup.py - 标准 Python distutils/setuptools 脚本
MANIFEST.in - Distutils 打包说明
requirements.txt - Pip 包依赖,conda 不使用
versioneer.py - 处理已安装包中版本从 git 标签自动设置的功能
.flake8 - 代码格式偏好设置。应在时间允许的情况下修复文件并将其从例外列表中移除。
.pre-commit-config.yaml - pre-commit 钩子配置文件。
.readthedocs.yml - Read the Docs 配置文件。
buildscripts/condarecipe.local - Conda 构建配方
持续集成
azure-pipelines.yml - Azure Pipelines CI 配置 (活跃于: Win/Mac/Linux)
buildscripts/azure/ - 针对特定平台的 Azure Pipeline 配置
buildscripts/incremental/ - 在各种 CI 系统上构建 Numba 的通用脚本
codecov.yml - Codecov.io 覆盖率报告
文档
LICENSE - Numba 许可
LICENSES.third-party - Numba 中包含的第三方代码许可
README.rst - 仓库的 README,也上传到 PyPI
CONTRIBUTING.md - 关于如何为项目贡献的文档(已过时,应更新为指向 Sphinx 文档)
CHANGE_LOG - Numba 发布历史,也直接嵌入到 Sphinx 文档中
docs/ - 文档源
docs/_templates/ - 模板目录(用于覆盖 Sphinx 主题的默认设置)
docs/Makefile - 用于使用
make
构建 Sphinx 文档docs/source - Numba 文档的 ReST 源
docs/_static/ - Numba 文档的静态 CSS 和图像资源
docs/make.bat - 未使用(移除?)
docs/requirements.txt - 用于使用 Read the Docs 构建文档的 Pip 包依赖。
numba/scripts/generate_lower_listing.py - 倾倒所有用
@lower*
装饰的已注册实现,以供参考文档。目前缺少来自更高级别扩展 API 的实现。
Numba 源代码
Numba 在一个包中同时包含源代码和测试。
numba/ - 所有源代码和测试
公共 API
这些定义了 Numba 公共接口的各个方面。
numba/core/decorators.py - 用于在 CPU 上编译常规函数的面向用户的装饰器
numba/core/extending.py - 用于扩展 Numba 的公共装饰器(
overload
、intrinsic
等) - numba/experimental/structref.py - 用于定义可变结构体的公共 APInumba/core/ccallback.py -
@cfunc
装饰器,用于将函数编译为固定的 C 签名。用于创建回调。numba/np/ufunc/decorators.py - ufunc/gufunc 编译装饰器
numba/core/config.py - Numba 全局配置选项和环境变量处理
numba/core/annotations - Numba IR 的类型注解收集和打印
numba/core/annotations/pretty_annotate.py - Numba 函数和类型代码高亮(包括 ANSI 终端和 HTML)
numba/core/event.py - 一个简单的事件系统,供应用程序监听特定的编译器事件。
分派
numba/core/dispatcher.py - Dispatcher 对象是由
@jit
生成的已编译函数。Dispatcher 对不同的类型签名有不同的实现。numba/_dispatcher.cpp - C++ dispatcher 实现(用于常见数据类型的速度优化)
编译器管道
numba/core/compiler.py - 编译器管道和标志
numba/core/errors.py - Numba 异常和警告类
numba/core/ir.py - Numba IR 数据结构对象
numba/core/bytecode.py - 字节码解析和函数身份 (??)
numba/core/interpreter.py - 将 Python 解释器字节码翻译成 Numba IR
numba/core/analysis.py - 用于分析 Numba IR 的实用函数(变量生命周期、修剪分支等)
numba/core/controlflow.py - Numba IR 和 Python 字节码的控制流分析
numba/core/typeinfer.py - 类型推断算法
numba/core/transforms.py - Numba IR 转换
numba/core/rewrites - 编译器使用的重写通道
numba/core/rewrites/__init__.py - 加载所有重写通道,以便将其放入注册表中
numba/core/rewrites/registry.py - 用于收集重写通道的注册表对象
numba/core/rewrites/ir_print.py - 将 print() 调用写入 IR 中的特殊打印节点
numba/core/rewrites/static_raise.py - 将具有静态参数的异常转换为可以降低的特殊形式
numba/core/rewrites/static_getitem.py - 重写带有常量参数的 getitem 和 setitem,以允许类型推断
numba/core/rewrites/static_binop.py - 重写带有常量参数的二元操作(特别是
**
),以便生成更快的代码numba/core/inline_closurecall.py - 将闭包函数的主体内联到调用站点。支持数组推导、归约内联和模板内联。
numba/core/postproc.py - Numba IR 的后处理器,计算变量生命周期,插入 del 操作,并处理生成器
numba/core/lowering.py - 将 Numba IR 降低到 LLVM 的通用实现 numba/core/environment.py - 运行时环境对象
numba/core/withcontexts.py - 在 nopython 模式下实现上下文管理器的通用脚手架,以及对象模式上下文管理器
numba/core/pylowering.py - 对象模式下 Numba IR 的降低
numba/core/pythonapi.py - 用于与 CPython API 接口的 LLVM IR 代码生成
numba/core/targetconfig.py - 目标配置(如编译器标志)的实用工具。
类型管理
numba/core/typeconv/ - C++ 和 Python 中类型转换和类型签名匹配的实现
numba/capsulethunk.h - 由 typeconv 使用
numba/core/types/ - Numba 类型层次结构的定义,在编译器中到处用于选择实现
numba/core/consts.py - 常量推断(用于在可能的情况下在代码生成期间提供常量值)
numba/core/datamodel - 不同上下文中数据类型的 LLVM IR 表示
numba/core/datamodel/models.py - 大多数标准类型的模型
numba/core/datamodel/registry.py - 用于注册新数据模型的装饰器
numba/core/datamodel/packer.py - 将类型化值打包到数据结构中
numba/core/datamodel/testing.py - 数据模型测试(应该移动吗?)
numba/core/datamodel/manager.py - 将类型映射到数据模型
编译扩展
Numba 为核心功能使用少量编译过的 C/C++ 代码,例如在性能关键的分派和类型匹配中,以及封装与 CPython API 的直接交互更方便的地方。
numba/_arraystruct.h - 用于保存 NumPy 数组属性的结构体。在 helperlib 和 Numba 运行时中使用。
numba/_helperlib.c - Numba 编译代码在运行时所需的 C 函数。链接到预先编译的模块中
numba/_helpermod.c - 带有
_helperlib.c
中函数指针的 Python 扩展模块numba/_dynfuncmod.c - 导出 _dynfunc.c 功能的 Python 扩展模块
numba/_dynfunc.c - C 级环境和闭包对象(与 numba/target/base.py 保持同步)
numba/mathnames.h - 用于定义数学函数名称的宏
numba/_pymodule.h - 用于 Python 2/3 C API 函数可移植命名的 C 宏
numba/mviewbuf.c - 处理 Python memoryviews
numba/_typeof.h | numba/_typeof.cpp - 类型指纹识别的 C++ 实现,由 dispatcher 使用
numba/_numba_common.h - 用于标记可在对象文件之间共享但不超出库范围的符号的可移植 C 宏。
杂项支持
numba/_version.py - 由 versioneer 更新
numba/core/runtime - 语言运行时。目前管理由 Numba 编译函数在堆上分配的引用计数内存
numba/core/ir_utils.py - 用于处理 Numba IR 数据结构的实用函数
numba/core/cgutils.py - 用于在 LLVM IR 中生成常见代码模式的实用函数
numba/core/utils.py - Python 3 功能的 Python 2 后向移植(也导入
six
的本地副本)numba/misc/appdirs.py - 用于确定每个平台应用程序配置目录的 vendored 包
numba/misc/POST.py - Numba 在 CI 中使用的开机自检脚本,以确保测试运行器和编译正常工作。
numba/core/compiler_lock.py - 全局编译器锁,因为 Numba 对 LLVM 的使用不是线程安全的
numba/misc/special.py - 特殊 Numba 函数(prange, gdb*)的 Python 存根实现
numba/core/itanium_mangler.py - Itanium C++ 名称修饰的 Python 实现
numba/misc/findlib.py - 用于在所有平台上定位共享库的辅助函数
numba/core/debuginfo.py - 用于构造 LLVM IR 调试信息的辅助函数
numba/core/unsafe/refcount.py - 读取对象的引用计数
numba/core/unsafe/eh.py - 异常处理辅助函数
numba/core/unsafe/nrt.py - Numba 运行时 (NRT) 辅助函数
numba/cpython/unsafe/tuple.py - 替换元组槽中的值
numba/np/unsafe/ndarray.py - NumPy 数组辅助函数
numba/core/unsafe/bytes.py - 从 void 指针复制和解引用数据
numba/core/callwrapper.py - 处理参数解封并在从 Python 切换到 nopython 模式时释放 GIL
numba/np/numpy_support.py - 用于处理 NumPy 以及在 Numba 类型和 NumPy dtypes 之间进行转换的辅助函数。
numba/core/tracing.py - 用于跟踪 Python 调用和发出日志消息的装饰器
numba/core/funcdesc.py - 用于描述函数元数据的类(在编译器中使用)
numba/core/sigutils.py - 用于解析和规范化 Numba 类型签名的辅助函数
numba/core/serialize.py - 支持编译函数的 pickle 序列化
numba/core/caching.py - 编译函数的磁盘缓存
numba/np/npdatetime.py - 用于实现 NumPy datetime64 支持的辅助函数
numba/misc/llvm_pass_timings.py - 记录 LLVM pass 耗时的辅助工具。
numba/cloudpickle - Vendored cloudpickle 子包
核心 Python 数据类型
numba/_hashtable.h | numba/_hashtable.cpp - Python 3.7 哈希表实现的适配
numba/cext/dictobject.h | numba/cext/dictobject.c - 类型化字典的 C 级实现
numba/typed/dictobject.py - 类型化字典的 Nopython 模式包装器
numba/cext/listobject.h | numba/cext/listobject.c - 类型化列表的 C 级实现
numba/typed/listobject.py - 类型化列表的 Nopython 模式包装器
numba/typed/typedobjectutils.py - 类型化字典和列表的通用实用工具
numba/cpython/unicode.py - Unicode 字符串(Python 3.5 及更高版本)
numba/typed - 静态类型容器的 Python 接口
numba/typed/typeddict.py - 类型化字典的 Python 接口
numba/typed/typedlist.py - 类型化列表的 Python 接口
numba/experimental/jitclass - 实验性 Python 类 JIT 编译的实现
numba/core/generators.py - 支持降低 Python 生成器
数学
numba/_random.c - NumPy / CPython 随机数生成器的重新实现
numba/_lapack.c - 调用 BLAS 和 LAPACK 函数的包装器(需要 SciPy)
并行加速器
代码转换 pass,从函数中提取可并行化代码并将其转换为多线程 gufunc 调用。
numba/parfors/parfor.py - 通用并行加速器
numba/parfors/parfor_lowering.py - 并行加速器的 gufunc 降低
numba/parfors/array_analysis.py - 并行加速器中使用的数组分析 pass
模板
@stencil
的实现
numba/stencils/stencil.py - 模板函数装饰器(没有使用并行加速器实现)
numba/stencils/stencilparfor.py - 模板的并行加速器实现
调试支持
numba/misc/gdb_hook.py - 从 nopython 模式跳转到 GDB 的钩子
numba/misc/cmdlang.gdb - 设置 GDB 以从 Python 设置显式断点的命令
类型签名(CPU)
一些(通常是较旧的)Numba 支持功能将允许的类型签名声明与实现定义分开。此包包含在类型推断期间必须匹配的类型签名注册表。
numba/core/typing - 类型签名模块
numba/core/typing/templates.py - 类型签名模板的基类
numba/core/typing/cmathdecl.py - Python 复数数学(
cmath
)模块numba/core/typing/bufproto.py - 解释支持缓冲区协议的对象
numba/core/typing/mathdecl.py - Python
math
模块numba/core/typing/listdecl.py - Python 列表
numba/core/typing/builtins.py - Python 内置全局函数和运算符
numba/core/typing/setdecl.py - Python 集合
numba/core/typing/npydecl.py - NumPy ndarray(和运算符)、NumPy 函数
numba/core/typing/arraydecl.py - Python
array
模块numba/core/typing/context.py - 类型上下文的实现(收集类型推断中使用的方法的类)
numba/core/typing/collections.py - 通用容器操作和具名元组
numba/core/typing/ctypes_utils.py - ctypes 包装函数指针的类型化
numba/core/typing/cffi_utils.py - CFFI 对象的类型化
numba/core/typing/typeof.py - typeof 操作的实现(将 Python 对象映射到 Numba 类型)
numba/core/typing/asnumbatype.py -
as_numba_type
操作的实现(将 Python 类型映射到 Numba 类型)numba/core/typing/npdatetime.py - NumPy 数组的 Datetime dtype 支持
目标实现(CPU)
Python / NumPy 函数和一些数据模型的实现。这些模块负责在降低过程中生成 LLVM IR。请注意,其中一些模块在 typing 包中没有对应的模块,因为较新的 Numba 扩展 API(如 overload)允许类型和实现一起指定。
numba/core/cpu.py - CPU 上的代码生成上下文
numba/core/base.py - 所有目标上下文的基类
numba/core/codegen.py - 代码生成驱动器
numba/core/boxing.py - 大多数数据类型的装箱和拆箱
numba/core/intrinsics.py - 将 LLVM 内联函数转换为其他数学调用的实用工具
numba/core/callconv.py - 实现 Numba 编译函数的不同调用约定
numba/core/options.py - 控制降低的选项容器
numba/core/optional.py - 表示值或
None
的特殊类型numba/core/registry.py - 用于收集特定目标实现的注册表对象
numba/core/imputils.py - 降低的辅助函数
numba/core/externals.py - 注册链接生成代码所需的外部 C 函数
numba/core/fastmathpass.py - 重写 pass,将 fastmath 属性添加到函数调用站点和二元操作
numba/core/removerefctpass.py - 重写 pass,移除不必要的增量引用/减量引用对
numba/core/descriptors.py - 所有目标描述符的空基类(这是否需要?)
numba/cpython/builtins.py - Python 内置函数和运算符
numba/cpython/cmathimpl.py - Python 复数数学模块
numba/cpython/enumimpl.py - 枚举对象
numba/cpython/hashing.py - 哈希算法
numba/cpython/heapq.py - Python
heapq
模块numba/cpython/iterators.py - 可迭代数据类型和迭代器
numba/cpython/listobj.py - Python 列表
numba/cpython/mathimpl.py - Python
math
模块numba/cpython/numbers.py - 数值(int、float 等)
numba/cpython/printimpl.py - Print 函数
numba/cpython/randomimpl.py - Python 和 NumPy
random
模块numba/cpython/rangeobj.py - Python range 对象
numba/cpython/slicing.py - 切片对象,以及切片中使用的索引计算
numba/cpython/setobj.py - Python 集合类型
numba/cpython/tupleobj.py - 元组(静态类型为不可变结构)
numba/misc/cffiimpl.py - CFFI 函数
numba/misc/quicksort.py - 用于列表和数组对象的快速排序实现
numba/misc/mergesort.py - 用于数组对象的归并排序实现
numba/np/arraymath.py - 数组上的数学运算(Python 和 NumPy)
numba/np/arrayobj.py - 数组操作(NumPy 和缓冲区协议)
numba/np/linalg.py - NumPy 线性代数操作
numba/np/npdatetime.py - NumPy datetime 操作
numba/np/npyfuncs.py - 在生成某些 NumPy ufunc 时使用的内核
numba/np/npyimpl.py - 大多数 NumPy ufunc 的实现
numba/np/polynomial/polynomial_functions.py - NumPy
Polynomial
函数的实现numba/np/polynomial/polynomial_core.py - NumPy
Polynomial
类的实现numba/np/ufunc_db.py - 将类型映射到 ufunc 实现的大表
Ufunc 编译器和运行时
numba/np/ufunc - ufunc 编译器实现
numba/np/ufunc/_internal.h | numba/np/ufunc/_internal.c - 带有使用 CPython 和 NumPy C API 辅助函数的 Python 扩展模块
numba/np/ufunc/_ufunc.c - 由 _internal.c 使用
numba/np/ufunc/gufunc_scheduler.h | numba/np/ufunc/gufunc_scheduler.cpp - 将工作块调度到线程
numba/np/ufunc/dufunc.py - 可以在调用时编译新实现的特殊 ufunc
numba/np/ufunc/ufuncbuilder.py - ufunc/gufunc 编译器管道的顶层编排
numba/np/ufunc/sigparse.py - 广义 ufunc 索引签名的解析器
numba/np/ufunc/parallel.py -
parallel
目标的 Codegennumba/np/ufunc/array_exprs.py - 重写 pass,将常规函数中的数组表达式转换为 ufunc
numba/np/ufunc/wrappers.py - 用循环包装标量函数内核
numba/np/ufunc/workqueue.h | numba/np/ufunc/workqueue.c - 基于 pthreads/Windows 线程和队列的线程后端
numba/np/ufunc/omppool.cpp - 基于 OpenMP 的线程后端
numba/np/ufunc/tbbpool.cpp - 基于 TBB 的线程后端
单元测试(CPU)
CPU 单元测试(GPU 目标单元测试在后面章节中列出)
runtests.py - 启动测试运行器并打开完整编译器回溯的便捷脚本
.coveragerc - Coverage.py 配置
numba/runtests.py - unittest 运行器的入口点
numba/testing/_runtests.py - 自定义测试运行器命令行界面的实现
numba/tests/test_* - 测试用例
numba/tests/*_usecases.py - 由一些单元测试编译的 Python 函数
numba/tests/support.py - 测试辅助函数和特殊 TestCase 实现
numba/tests/dummy_module.py - 在
test_dispatcher.py
中使用的模块numba/tests/npyufunc - ufunc / gufunc 编译器测试
numba/testing - 测试支持代码
numba/testing/loader.py - 在磁盘上查找测试
numba/testing/notebook.py - 支持测试笔记本
numba/testing/main.py - Numba 测试运行器
命令行实用工具
bin/numba - 命令行存根,委托给
numba_entry.py
中的 main 函数numba/misc/numba_entry.py -
numba
命令行工具的主函数numba/pycc - 将函数预先编译为共享库扩展
numba/pycc/__init__.py -
pycc
命令行工具的主函数numba/pycc/cc.py - 用于标记要预先编译的函数的面向用户 API
numba/pycc/compiler.py - 用于创建独立 Python 扩展模块的编译器管道
numba/pycc/llvm_types.py -
compiler.py
使用的 LLVM 数据类型别名numba/pycc/modulemixin.c - 编译到每个已编译扩展中的 C 文件。引入 Numba 核心中使扩展独立的 C 源
numba/pycc/platform.py - 平台特定编译器工具链的可移植接口
numba/pycc/decorators.py - 用于标记要编译函数的已弃用装饰器。请改用
cc.py
。
CUDA GPU 目标
请注意,CUDA 目标确实重用了 CPU 目标的一些部分。
numba/cuda/ - CUDA (NVIDIA GPU) 目标的实现及相关单元测试
numba/cuda/decorators.py - CUDA 内核和设备函数的编译器装饰器
numba/cuda/deviceufunc.py - CUDA 的自定义 ufunc 调度
numba/cuda/dispatcher.py - CUDA JIT 函数的分派器
numba/cuda/printimpl.py - 设备打印的特殊实现
numba/cuda/libdevice.py - 注册 libdevice 函数
numba/cuda/kernels/ - 用于归约和转置的自定义内核
numba/cuda/device_init.py - 导入时初始化 CUDA 目标
numba/cuda/compiler.py - CUDA 目标的编译器管道
numba/cuda/intrinsic_wrapper.py - CUDA 设备内联函数(shuffle、ballot 等)
numba/cuda/initialize.py - CUDA 设备和子系统的延迟初始化。仅在用户导入
numba.cuda
时调用numba/cuda/simulator_init.py - 初始化 CUDA 模拟器子系统(仅在用户使用环境变量请求时)
numba/cuda/random.py - 随机数生成器的实现
numba/cuda/api.py - 导入到
numba.cuda.*
中的面向用户 APInumba/cuda/stubs.py - 只能在 GPU 设备代码中使用的函数的 Python 占位符
numba/cuda/simulator/ - 在 Python 解释器中模拟 CUDA 内核的执行
numba/cuda/vectorizers.py - CUDA 的 ufunc/gufunc 编译器子类
numba/cuda/args.py - 内核参数管理,包括主机<->设备传输
numba/cuda/target.py - GPU 的类型化和目标上下文
numba/cuda/cudamath.py - CUDA Python 中数学函数的类型签名
numba/cuda/errors.py - 内核启动配置的验证
numba/cuda/nvvmutils.py - 用于生成 NVVM 特定 IR 的辅助函数
numba/cuda/testing.py - 用于创建 CUDA 单元测试和捕获标准输出的支持代码
numba/cuda/cudadecl.py - GPU 上 Python 中 CUDA API(threadIdx、blockIdx、atomics)的类型签名
numba/cuda/cudaimpl.py - GPU 上 CUDA API 函数的实现
numba/cuda/codegen.py - CUDA 目标的代码生成器对象
numba/cuda/cudadrv/ - CUDA 驱动 API 的包装器
numba/cuda/cudadrv/dummyarray.py - 用于在主机上保存数组信息,但不保存数据。
numba/cuda/tests/ - CUDA 单元测试,当未检测到 CUDA 时跳过
numba/cuda/tests/cudasim/ - CUDA 模拟器测试
numba/cuda/tests/nocuda/ - 当 CUDA 不存在时 NVVM 功能的测试
numba/cuda/tests/cudapy/ - 用于 GPU 编译 Python 函数的测试
numba/cuda/tests/cudadrv/ - CUDA API 的 Python 包装器测试