ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

走过19年,每年千万下载量,科学计算开源库SciPy的前世今生

走过19年,每年千万下载量,科学计算开源库SciPy的前世今生 机器之心报道机器之心编辑部每年都有着千万次的下载数据, 这足以证明科学计算领域的开源库 SciPy 已经具备了一定的规模与影响力, 如今它也算得上是一个成熟的小伙伴了。SciPy, 这个在科学计算方面起着非常关键作用的工具库, 自从二零零一年到现在, 时间已经过去了好十几年。它为各种数值计算提供了完整的过程和流程, 其中包括最优化处理、积分运算以及微分方程求解等各个方面。另外, 它也为那些从事科研分析工作的人员提供了一个使用起来非常方便且运行速度高效的开源类的程序库。在前天, 也就是2月3日这一天, SciPy的维护者们发布了一篇论文, 这篇论文回顾了SciPy在发展过程中取得的里程碑式成就以及其中涉及的关键技术。他们还借助于SciPy 1.0这个象征着成熟版本的东西, 展示了目前科学计算领域处于什么样的状态, 同时也表明了未来发展的方向究竟是怎样的。为什么 SciPy 那么重要SciPy 是一个面向科学计算的开源的科学计算库。自从二零零一年首次被发布以来, SciPy 已经成为了语言中的科学算法的行业标准。该项目拥有超过八百个独特的代码贡献者, 还有数以千计的相关的开发包, 以及超过十五万, 零零百个依赖的存储库, 每年都有着以百万为单位的下载量。下面的这段介绍内容主要是概括 SciPy 1.0 所拥有的功能和相关的开发实践, 同时会重点地去说明一些最新的技术进步以及版本更新。需要注意的一点是, 这里涉及的数据更新情况是来自最新的反馈信息。SciPy 是一个基于两个空的内容的开源代码包, 当前的模块集包括了上述图片里面的内容。项目覆盖范围SciPy 给出了科学计算所使用的常用方法, 这些方法包括了许多现有数学软件分类体系里所提到的算法。在一些依靠一步步计算、速度并不快的专业方向之中, 比如矩阵向量相关的线性代数部分, SciPy 想要把相关的算法种类尽可能涵盖全面。而在其他领域, 它会提供那些基础的构件。它还能跟这个领域里的其他软件包进行很好的互动, 并且保持兼容。举个例子说吧。SciPy提供了人们期望在统计学教科书中能找到的基本算法。这些算法包括概率分布、假设检验、频率统计以及相关函数等等。但是, 它还提供了更加先进的统计估算方法以及相关的推断方法。虽然 -learn 涵盖了机器学习这一块内容, 不过 PyMC、emcee 等工具还都覆盖了贝叶斯统计和概率建模。SciPy 能干什么SciPy是一个在数学、科学以及工程这样一些领域当中特别常见的库, 我们大家都知道它可以用来处理插值问题、积分问题、最优化问题、用数值求解的方法来得出常微分方程的答案、信号处理等问题, 因此, 在自然科学这一大块领域里面绝大部分那些涉及到了计算的工作都能够被它给完成掉, 例如像我们所熟知的统计学习, 去拟合一个分布, 再或者去做一下K个最近的那种邻居的算法, 这样的操作都显得非常的轻松和不费力。当然, 如今新冠肺炎疫情受到广泛关注的情况是存在的, 研究人员也能够利用它来模拟各种关键信息。比如之前发表在《新英格兰医学杂志》上的一篇文章, 该文章详细阐述了新型冠状病毒肺炎在中国武汉早期的传播现象, 而这项研究是由中国疾病预防控制中心以及国内各个省、直轄市、自治区的疾病预防控制中心等机构共同完成并发表的。在把数据给弄到手了以后, 好多要做那些统计分析的活儿, 基本上都能够拿来那个 Scipy 来完成, 说详细点呢:这些分析任务的主要目的, 在于利用统计分布对相应的数据进行拟合工作。该篇有关肺炎的论文里的研究者, 采用了具体的方法去做这种拟合。然而实际上, SciPy 库中内置了一百多种概率分布。与此同时, 这些统计分析方面的操作, 也是完全可以通过 SciPy 工具来完成的。在面对来势汹汹的疫情情况的时候, 不管是我们拿到了最直接的实时数据, 还是通过从各种网站上抓取疫情相关的资料, 使用 SciPy 来进行建模和开展分析工作, 都是一个相当不错的选择。SciPy 发展里程碑进入20 世纪 90 年代末期的时候, 位于美国梅奥医学中心的一名博士生对外发布了许多包, 这些包都是建立在对数值数组进行操作的基础之内的, 同时, 该博士生还为多种领域提供了对应的算法支持, 这些领域具体包括信号处理、特殊函数运算、稀疏矩阵相关操作、正交分析、最优化处理以及快速傅里叶变换等等。这些包中包含了一组扩展模块, 这些模块是对和C语言的包装, 它们主要用于解决非线性方程以及最小二乘问题, 用于求微分方程的积分, 用于拟合曲线。后来, 编程的环境变得越来越多了, 有了合适的数值数组的对象了, 做全栈科学软件的时候已经够了。二零零一年, Eric Jones 和 创建了 科学计算解决方案。之后, 他们出于简化工具链的想法, 主导创立了以 SciPy 库为核心基础的 SciPy 项目。这个项目的发展势头非常迅猛, 首先在 2001 年的 2 月份正式上线了官方网站和代码仓库, 接着在同年 6 月正式宣布建立邮件列表用于交流, 到了 8 月, SciPy 的 0.1 版本随之正式发布与推出。SciPy这个库, 在刚出来的时候, 它的文档那是少得可怜。不过呢, 这种情况从2006年开始有了变化。为啥? 因为这一年发布了那个叫做Numpy指南的东西。到了2007年, 更有意思了, 出现了一个文档生成器。这个东西厉害在什么地方?它能让SciPy从一个纯普通的文本文件里, 直接变出带代码的超文本文档和PDF文档来, 而且还是自动完成的, 不用人工一个个去弄。在 2008 年的时候, 因为有了工具的出现, 这就使得 SciPy 这个平台能够按照维基百科的那种运作模式来开展协同式的文档编写工作。在早期的时候, 那些不断出现的主题, 反映了的开发状态, 它把中心放在了的底层数组包、绘图、并行处理、加速或者包装以及用户界面上这些东西上面。一直到2004年的这个时候, 关于SciPy应用于科学计算问题上的内容才开始出现了。图 1: 展示了在自 2001 年发布了 0.1 版, 一直到 2017 年推出了 1.0 版本的这个漫长过程中, SciPy 在发展时期所发生的一些被视为里程碑式的重要事件。SciPy 近三年的关键技术从 2001年发布的版本 0.1到前几年发布的成熟版 SciPy 1.0, 在最近三年里, 在科学计算领域已经积累了更多的技术成果。我们可以使用更少量的计算资源去执行大型的矩阵计算任务。我们也能以更为精简的操作步骤来拟合那些更错综复杂且种类繁多的概率分布模型。此外, 我们还可以尝试运行那些最新颖的优化策略算法。研究者在这篇论文里主要是对SciPy这个软件包在发展过程中所使用的那些关键的技术手段, 做了比较重点的介绍说明。数据结构稀疏矩阵在 scipy 当中, 它一共提供了 7 种稀疏矩阵的数据结构。我们也可以把它们叫做稀疏格式。其中最有代表性的一个类型是那种压缩行的或者压缩列的稀疏格式。这两者分别就是被称为 CSR 以及 CSC 的两种形式。这两种方式的好处都是能够迅速地实施主轴索引的操作, 同时也都特别擅长执行快速的矩阵乘以向量的运算。正由于这些优点, 所以这两种特定的稀疏数据结构在 SciPy 自身以及所有那些依赖它的其他库里面, 都已经得到了非常广泛的推广和应用。要是从新特性的这方面儿来看的话, scipy.矩阵以及线性运算子这么些个东西, 现在在支持矩阵乘法, 就是用那个at这个符号来代表的矩阵乘法, 这件事情上面都已经算是实现了。scipy这个模块里面实现了空间分割的数据结构。这种数据结构能够在K维的时空之中组织数据点。整个模块都通过模板化的类的方式, 用C语言进行了重写工作。同时还新增了对周期性边界条件的支持能力。它经常被用于模拟物理过程。在2013年这个时间点上, 基于.query的K最近邻算法的时间复杂度逼近了对数线性水平。到了2015年, 二元树计数算法通过加强方式支持了加权操作, 这种加强对于很多科学应用来说都是非常重要的部分。比如计算星系的相关性函数就是一个非常典型的例子, 它离不开这种带加权的算法支持。把这一切都统一捆绑到已经编译完成的代码里面去。到了 SciPy 这个软件版本更新到 0.19, 用户这一群体就可以直接去运用 scipy. 这一个对象, 用该对象来对底层的函数进行包装操作, 如此做法就能减少在直接从某一地方调用那些已经被编译好的 C 语言函数时所产生的额外开销, 这里的被编译过的 C 语言函数, 有可能是通过 Numba 或者某一个工具所生成出来的。数学优化scipy这个软件包的子模块, 它提供了数学方面的解决办法, 用来解决许多种不同类型的关于查找根以及做优化的各种问题。研究者把表 1 里的东西, 拿来看了又看, 详细比较了那一大堆最小化方法的特点。这些特点摆在那儿, 就说明了一个问题, 就是 SciPy 要想做到那个地步, 达到一个完整全面的水平, 它必须要把对应的数值方法, 还有相应的主题, 都统统囊括进去, 覆盖到位。统计分布scipy.这工具里头藏着一百个零八个概率分布。具体的数字是九十六个连续分布。还有十三个离散单变量分布。另外还包括了十个多变量分布。这整个实现过程是靠着一个一致的框架撑起来的。这个框架能提供一个抽样的办法。抽样的是指那些随机变量。它用来评估累积分布函数指数。也就是大家常说的CDF。它也用来评估概率密度函数指数。也就是人们口里的PDF。同时它还能适合每一个分布的参数。测试套件当人们去更改代码的时候, 测试驱动的开发这个东西, 被大家当成了一种用来管住不确定性的办法。对于 SciPy 里面的每一个组件, 研究人员都写了好多种那些能够去验证它们原本预期行为的小型可执行测试。这些小可执行测试加在一起, 就被称作『测试套件』了, 这就增强了大家对正确性和准确度方面的信心, 并且也允许使用这个系统的人去修改那些已经存在的代码的时候, 而不发生对预期行为的改变。在图 2 里, 大家可以清楚地看到, 不同版本的 SciPy 软件里面包含的那些东西, 还有它们的编译代码数量, 都是怎么变化的。除了要把单元测试给保证通过以外, 还有一个重要的事情, 就是得确保那个 SciPy 这个代码库的性能, 它能够随着时间往前推移, 是得到提升的。就比如说, 下面那个图3, 它展示的事情是这样的一个情况, 就是在大概有9年这样一个项目的这么长的这个发展历程里面, scipy.. .query 这个东西它的那些性能提升的情况到底是啥样的。图 3从 的提出到 SciPy 1.0 的发布这是有关 scipy 以及调用 query 函数的基准测试所得到的结果展示, 图中每一个被画出来的标记, 都专门用来代表在 SciPy这一项目的主代码分支里, 那些已经成功提交的基准测试任务, 在运行时所实际耗费掉的时间时长。SciPy 仍在路上SciPy 这个项目, 每隔六个月的时间, 就会进行一轮更新。只要是对它感兴趣、而且有技术能力的人, 就可以直接参与进去, 并且为项目贡献代码。尽管 项目在研发上面的投入成本, 已经超过了 1,000 万美元这个数额, 但是该项目实际上是没有得到资金支持的状态的。所有这些写好的代码, 基本上都是由大学的研究生, 还有学术界人员以及工业界的相关人士, 利用他们自己的课余时间才做出来的。SciPy 有着一个很大的开发社区, 用户基数也很庞大。在 2017 年, 从 PyPI 那里下载的次数是 13,096,468 次, 而通过 conda 来下载的次数则有 5,776,017 次。尽管如此, SciPy 还是在不断向前发展。那个在下图中展示的表格, 它是持续更新的文档的一部分, 用来详细描述项目团队正在努力进行的改进和提升工作方面的事情, 同时这份文档里面也提到了还存在一些需要去改进的地方。
返回列表