Header: header

一些 NumPy 和 SciPy 的历史

2024-11-11

当今科研界,NumPy 和 SciPy 已经成为了用 Python 做科学计算和数据分析的“标准库”。目前有大量项目使用它们,其中不乏一些知名项目。而我们不禁要问,NumPy 和 SciPy 是如何达到今天的成就的?

 

本文主要参考 https://arxiv.org/abs/1907.10121

在当今科研界,Python 已经是一门被广泛使用的编程语言,而 NumPy 和 SciPy 则是使用 Python 做科学计算和数据分析的“标准库”。说起 Python 科学计算,大家首先就会想到这两个库;甚至当有人问你是否熟练掌握了 Python 的时候,可能他的意思并不是你是否掌握了 Python 的语法和标准库,而是会不会用 NumPy 和 SciPy 等科学计算包。NumPy 和 SciPy 被用于一些知名的项目,例如 LIGO 引力波分析以及 M87 黑洞图像的制作,更不要提大量的机器学习相关的 GitHub 仓库都在使用它们 1。种种事实都表明了它们的成功,而我们不禁要问,它们是如何达到今天的成就的?

black hole and gravitational wave

以上图片组合自 https://www.nature.com/articles/d41586-023-01732-4https://www.jpl.nasa.gov/images/universe/20190410/blackhole20190410.jpg

SciPy 刚开始几乎没有任何资金支持,更不要说专业的软件工程师和研究团队了。早期的开发工作主要是由一些研究生完成的,他们大多没有正式的计算机科学背景,也没有接受过专业的软件开发培训,而且更重要的一点是,他们的开发工作往往得到没有导师的支持。就是在这样的条件下,SciPy 居然能够成长到如今的规模,挑战了已经完善的、由数百万资金和数百名高素质工程师支持的研究软件生态系统,也是很令人惊讶的。

要脱离 Python 来讲 NumPy 和 SciPy 的成功是不现实的。Python 是由 Guido van Rossum 在 1980 年代开发的高级编程语言。如果你学过其他的编程语言,如 C 语言,那么你一定会对 Python 的动态类型和简介易读的语法印象深刻。事实上,这也是 1990 年代使用 Python 的科学家们(我怀疑大多数是研究生)的感受。科学计算的代码相比于一般应用程序或者程序包最大的区别,我认为有两个。首先是科学计算的代码变动快、需要快速编写。例如,你看到程序的输出哪里不太对,需要看看变量的分布;或者你想试试不同的优化算法对结果有哪些影响;甚至对算法的修改需要重写大量代码。所有的这些情形都需要快速编写代码进行验证,而使用 Python 恰好能够帮助科研人员实现对代码的原型开发。第二个特点是,铁打的导师,流水的研究生。但凡不是导师亲临一线写代码,这些代码就往往需要在一届届研究生之间代代相传。这就要求(一般的研究生)写出来的代码具有良好的可读性,而 Python 正好满足这一需求。谁也不想被不知道谁留下来的 Fortran 天书、漫天的 C 指针,以及 C++ 的十八种写法折磨吧?你说 MATLAB?谁也不想发给合作者一个程序然后他告诉你他没有许可运行不了吧?

除了 Python 的语法特性以外,它还能够很方便地和已有的 C 或者 Fortran 程序进行对接。(这里说的是最主流的 Python 实现:CPython。)这下不愿面对 Fortran 和 C 的同学有福了,只需要用 Python 把它们对接起来,就可以同时享受原有程序的速度和 Python 带来的便捷。

以上这些 Python 的特性只是关注于科学计算层面。事实上,Python 是一个一般性的编程语言,可以用于服务器开发运维、桌面程序和游戏开发、网络爬虫等多个领域。Python 从设计之初就没有把矩阵运算等功能内置在语言当中,而是作为独立的第三方库开发。这与 Matlab, Julia 等语言有着本质的不同。正因如此的选择,才有更多的的人了解 Python、使用 Python,让整个 Python 社区活跃起来。从语言的设计角度来看,相比于往已有的专注于科学计算的语言里加入一些一般性编程语言应有的语法功能,不如基于一个功能丰富的一般性的编程语言加入科学计算库来得方便自然 2

Python usage 2023

以上图片截图自 https://lp.jetbrains.com/python-developers-survey-2023/

越来越多的科学研究者愿意使用 Python,这构成了 NumPy 和 SciPy 诞生的基础。我们再将视线拉回到 1990 年代。那时候连 Python 2.0 都还没有,而对科学计算的支持,尤其是对矩阵运算的需求,就已经被提上了日程。 就这样,在 Jim Fulton 等人的共同努力下,NumPy 的前身 Numeric 诞生了。有了 Numeric 库以后,涌现了大量基于 Numeric 库的科学计算库。其中最值得一提的是来自妙佑医疗国际 (Mayo Clinic) 的博士研究生 Travis Oliphant,他为了分析医疗影像,开发了大量基于 Numeric 和相关 Fortran 或 C 库的科学计算库,包括信号处理、积分、优化等诸多方面。他也是后来 Numpy 的创始人。

大量不同计算库的涌现给用户的安装和使用带来了一定的困难,因此建立一个统一的接口势在必行。2001 年, Eric Jones 和 Travis Vaught 建立了一家名为 Enthought 的公司,并创立了 SciPy 项目,旨在融合之前人们开发的各个科学计算库。项目发展得很快,8 月发布了 0.1 版本,转年 9 月就在加州理工举办了 SciPy 的第一届 workshop,与会者达 50 人。

也在差不多的时间,Numeric 库也逐渐步入正轨,由劳伦斯利弗莫尔国家实验室 (Lawrence Livermore National Laboratory,LLNL) 的 Paul Dubois 接手,其文档也得到了大幅的完善。另外,主导哈勃空间望远镜研究的空间望远镜研究所 (Space Telescope Science Institute, STScI) 也转向使用 Python 和 Numeric 库。然而,Numeric 库并不能很好地处理高清图像这类大矩阵,于是 STScI 决定开发 NumArray 库用于处理大矩阵。不幸的是,NumArray 库对小矩阵的处理性能堪忧,从而不能合并到 Numeric 库中,用户也只能二选一。终于,到 2005 年,Travis Oliphant 把 Numeric 库和 NumArray 库的优点综合起来,写成了 NumPy 库,并于 2006 年发布 1.0 版本。SciPy 也从此迁移到了基于 NumPy 的架构。

Scientific Python ecosystem

以上图片来自 https://fabienmaussion.info/acinn_python_workshop/

21 世纪初除了 NumPy 和 SciPy 的发展以外,也诞生了大量在科学计算领域出名的程序。例如,2000 年来自印度理工学院 (Indian Institute of Technology) 的博士研究生 Prabhu Ramachandran 基于 C++ 的 VTK 库开发了 3D 绘图库 Mayavi;2001 年,来自科罗拉多大学博尔德分校 (University of Colorado Boulder) 的研究生 Fernando Pérez 开发了 IPython,也就是后来 Jupyter 的基础;2003 年来自芝加哥大学的博后 John Hunter 由于没有 MATLAB 的许可,就从头写了绘图库 Matplotlib。

scipy-timeline

以上图片来自 https://arxiv.org/abs/1907.10121

在接下来的时间里,SciPy 得到了长足的发展。SciPy 的目标变得更加专注,而对其他更高级功能的需求则在 2007 年催生出 SciKit 库。到 2009 年,SciPy 已经建成了长达 884 页的丰富文档,这也离不开 Sphinx 等优秀项目的支持。SciPy 的 conference 也越来越成熟,在欧洲和印度都有志愿者组织分会。此外,会议的内容也从 SciPy 具体的开发转变到了更广泛的领域,如 SciPy 在解决具体科学问题时的应用。到 2017 年,SciPy 1.0 版本发布,标志着 SciPy 进一步走向成熟。


  1. https://arxiv.org/abs/1907.10121
  2. http://hugunin.net/papers/hugunin95numpy.html
👍
1
Leave your comments and reactions on GitHub