NEP 3 — 清理 numpy.core 的数学配置#

作者:

David Cournapeau

联系方式:

david@ar.media.kyoto-u.ac.jp

日期:

2008-09-04

状态:

推迟

执行摘要#

在构建 numpy.core 之前,我们使用一些配置测试来收集有关可用数学函数的信息。多年来,配置变得复杂,以至于难以轻松支持新平台。

本提案的目标是清理数学功能的配置,以便于维护。

当前问题#

目前,数学配置主要测试一些数学函数,并相应地配置 numpy。但是,当前系统并未独立测试每个所需函数,而是更多地作为针对特定平台怪癖的变通方案而开发,使用了平台的隐式知识。这与只测试功能的正常理念(即 autoconf 理念,它指明了可移植性(至少在 Unix 上)的道路 [1])相悖。这导致了问题,因为在现有平台上修改或添加配置会打破隐式假设,而没有明确的解决方案。

例如,在 Windows 上,当使用 MinGW 构建 NumPy 时,最好强制配置 `sizeof(long double) == sizeof(double)`,因为 MinGW 使用 MS 运行时,而 MS 运行时不支持 `long double`。不幸的是,这样做会破坏 MinGW 数学函数的检测,因为存在 MinGW 配置 `sizeof(long double) != sizeof(double)` 的隐式假设。

另一个例子是仅使用一个函数来测试一组函数:如果 `expf` 被找到,则假定所有基本的浮点函数都可用。相反,每个函数都应该独立测试(`expf`、`sinf` 等)。

要求#

我们有两个重要要求
  • 它不应破坏任何当前支持的平台

  • 它不应使配置速度明显变慢(1-2 秒是可接受的)

提案#

我们建议打破任何隐式假设,并像 autoconf 通常所做的那样,独立测试每个数学函数。由于测试大量函数可能耗时,我们将采用类似于 autoconf 中 `AC_CHECK_FUNCS_ONCE` 的方案,即一次性测试一组函数,并且只有在失败的情况下才进行逐个函数的检查。当首次检查成功时,它应该与当前方案一样快,只是假设会被显式检查(例如,`HAVE_LONGDOUBLE_FUNCS` 所隐含的所有函数将一起检查)。

问题#

静态与非静态?对于基本函数,我们应该将其定义为静态还是非静态?

许可证#

本文档已置于公共领域。

[1]: Autobook 在此