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 - 调度器对象是由
@jit
生成的编译函数。调度器针对不同的类型签名有不同的实现。numba/_dispatcher.cpp - C++ 调度器实现(用于常见数据类型的速度优化)
编译器流水线
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 的后处理器,用于计算变量生命周期、插入删除操作以及处理生成器
numba/core/lowering.py - 将 Numba IR 降低到 LLVM 的通用实现 numba/core/environment.py - 运行时环境对象
numba/core/withcontexts.py - 在nopython模式下实现上下文管理器的通用脚手架,以及objectmode上下文管理器
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 Runtime。
numba/_helperlib.c - Numba 编译代码在运行时所需的 C 函数。链接到预编译模块中。
numba/_helpermod.c - 包含指向
_helperlib.c
中函数的指针的 Python 扩展模块numba/_dynfuncmod.c - 导出 _dynfunc.c 功能的 Python 扩展模块
numba/_dynfunc.c - C 级别的 Environment 和 Closure 对象(与 numba/target/base.py 保持同步)
numba/mathnames.h - 定义数学函数名称的宏
numba/_pymodule.h - 用于Python 2/3可移植命名C API函数的C宏
numba/mviewbuf.c - 处理 Python 内存视图
numba/_typeof.h | numba/_typeof.cpp - 类型指纹的C++实现,由调度器使用
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 - 用于确定每个平台上应用程序配置目录的打包库
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 - 从空指针复制和解引用数据
numba/misc/dummyarray.py - 由GPU后端用于在主机上保存数组信息,但不保存数据。
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 - 支持编译函数的序列化
numba/core/caching.py - 编译函数的磁盘缓存
numba/np/npdatetime.py - 实现 NumPy datetime64 支持的辅助函数
numba/misc/llvm_pass_timings.py - 用于记录LLVM传递时间的辅助工具。
numba/cloudpickle - 打包的 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)
ParallelAccelerator
代码转换过程,从函数中提取可并行化的代码并将其转换为多线程gufunc调用。
numba/parfors/parfor.py - 通用 ParallelAccelerator
numba/parfors/parfor_lowering.py - 并行加速器的gufunc降低
numba/parfors/array_analysis.py - 在 ParallelAccelerator 中使用的数组分析传递
Stencil
@stencil
的实现:
numba/stencils/stencil.py - 模板函数装饰器(未使用ParallelAccelerator实现)
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 数组的日期时间数据类型支持
目标实现(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 - 重写传递以将 fastmath 属性添加到函数调用站点和二进制操作
numba/core/removerefctpass.py - 重写传递以移除不必要的 incref/decref 对
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 - 数值类型(整数、浮点数等)
numba/cpython/printimpl.py - 打印函数
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 日期时间操作
numba/np/npyfuncs.py - 用于生成某些NumPy ufuncs的内核
numba/np/npyimpl.py - 大多数 NumPy ufuncs 的实现
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/deviceufunc.py - 非CPU目标的自定义ufunc调度
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
目标生成代码numba/np/ufunc/array_exprs.py - 将常规函数中的数组表达式重写为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
中的主函数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/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.*
的用户接口numba/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 - CUDA API(threadIdx、blockIdx、原子操作)在GPU上的Python类型签名
numba/cuda/cudaimpl.py - 在GPU上实现CUDA API函数的实现
numba/cuda/codegen.py - 用于CUDA目标的代码生成器对象
numba/cuda/cudadrv/ - 围绕CUDA驱动API的封装
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包装器的测试