NEP 36 — 公平竞争#

作者:

Stéfan van der Walt <stefanv@berkeley.edu>

状态:

活跃

类型:

信息性

创建日期:

2019-10-24

决议:

https://mail.python.org/pipermail/numpy-discussion/2021-June/081890.html

摘要#

本文档为参与 NumPy 项目的公司和外部开发者制定了行为准则。它涵盖:

  • NumPy 名称的使用限制

  • 如何以及是否发布修改过的发行版

  • 如何让我们了解打了补丁的版本

阅读本 NEP 后,公司和开发者将了解社区希望看到哪些行为,以及我们认为哪些行为是麻烦、令人烦恼和不可接受的。

动机#

偶尔,我们会得知有被外部人员修改和传播的 NumPy 版本。这些打了补丁的版本可能给 NumPy 社区带来问题(例如,参见 [1][2])。当出现此类问题时,我们的开发者会浪费时间识别问题版本、查找修改之处并确定适当的行动方案。

此外,Python 包索引上的一些包的命名方式让用户误以为它们是经过 NumPy 批准或维护的。我们希望减少此类事件的数量。

2019 年 10 月 16 日 的社区会议上,社区决定起草指南来解决这些问题。

范围#

本文档旨在定义一套最基本的规则,遵循这些规则将被视为符合 NumPy 开发者期望的善意努力。

我们希望,觉得需要修改 NumPy 的开发者会首先考虑为项目做出贡献,或者使用现有的几种机制之一来扩展我们的 API 并操作外部定义的数组对象。

如有疑问,请先与我们沟通。我们可能会建议替代方案;至少,我们会做好准备。

公平竞争规则#

  1. 请勿将 NumPy 名称重复用于非 NumPy 社区开发的项目。

    截至本文撰写之时,社区开发的以 numpy 命名的包只有少数几个,包括 numpynumpy-financialunumpy。我们请求外部包不要包含“numpy”一词,即,避免使用诸如 mycompany_numpy 之类的名称。

    需明确的是,此规则仅适用于模块(包名);您的库中有一个名为 mylibrary.numpy子模块是完全可以接受的。

    NumPy 是 NumFOCUS 拥有的商标。

  2. 请勿重新发布修改过的 NumPy 版本。

    修改过的 NumPy 版本使开发者很难处理错误报告,因为我们通常不知道 NumPy 的哪些部分已被修改。

    如果您必须违反此规则(我们恳请您不要这样做!),那么请在 __version__ 标签中明确说明您已修改了 NumPy,例如:

    >>> print(np.__version__)
    '1.17.2+mycompany.15`
    

    我们理解,通常需要进行小修补以使库在发行版中工作。例如,Debian 可能会修补 NumPy,使其在正确的位置搜索优化的 BLAS 库。这是可以接受的,但我们要求不要进行实质性更改。

  3. 请勿扩展或修改 NumPy 的 API。

    如果您非要违反规则二,请不要向命名空间添加额外函数,或修改现有函数的 API。NumPy 的 API 已经相当庞大,我们正在努力在可行的情况下进行精简。在发行版中暴露额外的函数会让用户和开发者感到困惑。

  4. 请务必使用官方机制与 API 交互。

    诸如 __array_ufunc____array_function__ 之类的协议旨在帮助外部包更容易地与 NumPy 交互。例如,后者允许来自外部库的对象通过 NumPy。我们积极鼓励使用任何这些“官方认可”的机制来覆盖或与 NumPy 交互。

    如果这些机制被认为不足,请在对 NumPy 进行“猴子补丁”(monkeypatching)之前在邮件列表中发起讨论。

问答#

问: 我们希望发布一个针对我们公司 CPU 优化、利用专用指令的 NumPy 版本。您不建议这样做,那么我们该怎么办?

答: 请考虑将所需的补丁包含在官方 NumPy 仓库中。我们不仅鼓励此类贡献,而且我们已经为某些平台提供了优化的循环。

问: 我们希望提供一个比 NumPy 更快的 FFT 版本,但 NumPy 没有覆盖其 FFT 例程的机制。我们该如何进行?

答: 我们批准两种解决方案:让用户通过一段代码安装您的优化,例如:

from my_company_accel import patch_numpy_fft
patch_numpy_fft()

或者让您的发行版自动执行上述操作,但在终端上清晰地打印一条消息,说明正在发生什么。

We are now patching NumPy for optimal performance under MyComp
Special Platform.  Please direct all bug reports to
https://mycomp.com/numpy-bugs

如果您需要额外的代码覆盖机制,请在邮件列表中与开发团队讨论。

问: 我们希望发布带有更快线性代数例程的 NumPy。我们被允许这样做吗?

答: 是的,这通过链接到不同版本的 BLAS 明确支持。

讨论#

参考文献和脚注#