C API折旧

背景

numpy为第三方扩展所公开的API在多年的发布中不断增长,并且允许程序员直接从C访问numpy功能。这个API最好被描述为“有机的”。多年来,它从多种相互竞争的欲望和多个角度发展而来,深受用户从numeric和numarray轻松转向numpy的欲望的强烈影响。核心API起源于1995年的Numeric,有很多模式,比如大量使用宏来模仿Python的C-API,以及90年代后期的编译器技术。也只有少数志愿者花很少的时间来改进这个API。

目前正在努力改进API。在这项工作中,确保为numpy 1.x编译的代码继续为numpy 1.x编译是很重要的。同时,某些API将被标记为已弃用,以便未来的代码可以避免这些API,并遵循更好的实践。

C API中的弃用标记所起的另一个重要作用是隐藏numpy实现的内部细节。对于那些需要直接、方便地访问ndarrays数据的人,这不会删除此功能。相反,有许多潜在的性能优化需要更改实现细节,而numpy开发人员由于保持ABI兼容性的高价值而无法尝试它们。通过取消这种直接访问,我们将来将能够以目前无法达到的方式提高numpy的性能。

折旧机制npy_no_deprecated_api

在C中,没有相当于Python支持的反预测警告。一种方法是在文档和发行说明中标记它们,然后在未来的主要版本(numpy 2.0及更高版本)中删除或更改不推荐使用的功能。但是,numpy的次要版本不应该有主要的C-API更改,这会阻止在以前的次要版本上工作的代码。例如,我们将尽最大努力确保在numpy 1.4上编译和工作的代码应该继续在numpy 1.7上工作(但可能有编译器警告)。

要使用NPYŠu NOŠu DEPRECATEDŠAPI机制,您需要在包含任何NumPy头之前将其定义为NumPy的目标API版本。如果要确认代码是否符合1.7,请使用:

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

在支持警告机制的编译器上,如果您没有定义符号npy不推荐使用的api,numpy会发出编译器警告。这样,会为那些可能没有仔细阅读发行说明的第三方开发人员标记出存在拒绝的事实。