Python 脚本中的 bug,可能影响了数百项学术研究
Python 作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于科学计算生态,在数据分析、交互、可视化等方面。
不久前,夏威夷大学的化学研究人员发现,用于化学数据计算分析的一组 Python 脚本编程有误,该脚本的不同计算机操作系统中运行会产生不同的结果。在计算分析蓝藻实验的结果时,研究人员 Philip Williams 等人发现,通过 Python 脚本跑出来的实验结果,因操作系统而异。这导致这些研究人员对已发表的 150 多项化学研究论文结果产生了怀疑。
这份脚本名为“Willoughby-Hoye”,脚本大约有 1000 行,它自 2014 年开始使用,用来计算核磁共振图谱的化学位移值。研究人员发现在 macOS Mavericks 和 Windows 10 运行的结果是相同的(173.2),也在研究人员的预想中,但在 macOS Mojave 和 Ubuntu 上却不相同(分别为 172.4 和 172.7),几个结果看起来差不多,但在科学研究领域,对精度要求很高,看似接近的数字起止相差很大。
那么为什么出现这类结果呢?
这份脚本出现的 bug,与我们印象中的 bug 很不同,bug 通常在任何地方都会有相同错误结果,而不只是在某些特定的环境中。经过检查,问题锁定在数据的检索方式,每次运行的数据都存储在两个文件中,文件按文件名成对检索,并成对处理。关键在于,检索文件的顺序因操作系统而异。只要文件匹配,就能得到正确的结果。如果不是,将处理来自两次不同运行的数据。
此前,许多新闻报道中认为罪魁祸首是 Python 标准库模块 glob 模块,该脚本使用 Python 的 glob 模块来查找符合特定格式的文件路径名——基于 glob 的结果去生成读取文件列表。但是 glob 的结果又取决于操作系统的文件返回值。于是脚本的计算结果会受到文件处理顺序的影响。在 Python 文档中关于 glob 模块的描述如下:
glob 模块根据 Unix shell 使用的规则查找与指定模式匹配的所有文件路径名,最终结果以任意顺序返回。
所以这并不是 bug, glob 的结果是任意顺序返回的,它并没有按照指定的顺序返回结果。这错不在 Python,而在于编写这份 Python 脚本的人。该脚本的作者应该在代码中定义期望的排序行为,以确保一致性。如果是一个好的程序员,在详细阅读文档后,他们能够注意到文档中的说明(例如 glob 的返回结果是任意的),从而在编写代码时考虑到它。这个事情也告诉我们,好的编程技巧相当重要,尤其是当应用到科学计算这类严谨的研究中,失之毫厘,必然差之千里。
Williams 等人发现了这个问题后,为该代码添加了必要的排序代码。他希望科学家们更加关注实验的计算部分,至于该脚本问题影响到其他论文研究结果有多少,他也难以得出定论。
一般来说,代码并不是一篇学术论文中最被关注的点。所以说,计算机学界及其他领域学界往往不会对代码质量过分深究。这也导致,不管是学术研究者还是业界人士,都能感觉到「学术原型代码」和「工业级别代码」之间的巨大差异。
不过相比于工业界的代码,学术论文中代码 bug 的影响毕竟还是有限的。
参考:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每日一博 | 运用第一性原理探寻AI本质
文章来源:宜信技术学院|宜信支付结算团队技术分享第二期-支付结算机器学习技术团队负责人 刘创 分享《AI与第一性原理》 分享者:宜信支付结算机器学习技术团队负责人 刘创 原文发布于个人博客:动物园的猪 一、AI和第一性原理 AI,也就是人工智能,这几年非常火,但究竟AI的本质是什么呢?用第一性原理来探寻AI的本质,可能更容易理解。接下来我们一起探讨AI、第一性原理、以及如何使用第一性原理来理解AI的本质。 二、第一性原理 2.1 什么是第一性原理 第一性原理,这个概念来自于古代希腊先哲——亚里士多德。 “在任何一个系统中,存在第一性原理,是一个最基本的命题或者假设,不能被省略,也不能被违反。” ——亚里士多德 听上去有些晦涩,但解释起来很简单,就是:任何事物,都有其内在存在的“第一性原理”。我的理解,就是其最最本质的东西,这个东西其实就在那里,是基于最基本的假设,你必须要认可它,它不需要什么前提和证明,有了它,你就可以去推演其他别的结论出来,这些结论最终形成了整个系统。 举几个例子吧。 我们初中就开始学习的牛顿的机械论,他的第一性原理就是万有引力,他所谓的“基本命题”就是万物之间有相互...
- 下一篇
自由开源 Linux 手机 Librem 5 第二批将延期发货
昨天我们才介绍了Purism 分享的首批 Librem 5 手机和 PureOS UI 照片,今天发现 Purism 官网上宣布延迟第二批手机的发货时间。 Librem 5 是一款以用户隐私和加密为核心的自由开源Linux 智能手机,其运行基于 Debian 的 GNU/Linux 操作系统,桌面环境使用 KDE Plasma Mobile 或 GNOME Shell,只运行开源应用。该项目于 2017 年启动,并获得了超过 150 万美元的众筹,随后便进入硬件生产阶段。 Librem 5 使用分批迭代发货的策略,每次迭代都会在第一版手机的快速滚动版本中改进之前的版本,包括针对上下文的第二次修改计划。 迭代计划使得 Purism 能够收集用户的反馈并迅速对下一代手机做出改进。Librem 5 的每次迭代都会包括对硬件、机械设计和软件的更新,购买者可以自行选择希望接收的批次。按计划,从今年九月到明年年底,完整的迭代计划分为 6 个批次,分别从 A 到 F、以树木名称来命名,具体时间规划如下: 初始版Batch Aspen会提供所有硬件组件。在软件方面,用户可以通过终端从 PureOS S...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路