NEP 36 — 公平竞争#

作者

斯特凡·范德沃尔特< stefanv @伯克利教育>

地位

积极的

类型

信息性

创建

2019-10-24

解决

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

抽象的

本文档为参与 NumPy 项目的公司和外部开发人员制定了游戏规则。它涵盖:

  • NumPy 名称的使用限制

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

  • 如何让我们了解已修补的版本

公司和开发者读完这个N​​EP后就会知道社区希望看到什么样的行为,以及我们认为哪些行为是麻烦的、烦人的、不可接受的。

动机

时不时地,我们就会了解到外界修改和传播的 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 交互。

    如果这些机制被认为不够,请在对 NumPy 进行猴子修补之前在邮件列表上开始讨论。

问题与解答

问:我们希望分发 NumPy 的优化版本,该版本利用我们公司 CPU 的特殊指令。你建议反对,那么我们该怎么办?

答:请考虑在官方 NumPy 存储库中包含所需的补丁。我们不仅鼓励此类贡献,而且我们已经针对某些可用平台优化了循环。

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

A:我们认可的解决方案有两种:让用户用一段代码来安装你的优化,比如:

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 明确支持的。

讨论

参考文献和脚注#