当前位置: 首页 > 编程日记 > 正文

Python脚本BUG引发学界震动,影响有多大?

作者 | beyondma
编辑 | Jane
来源 | CSDN博客

近日一篇“A guide to small-molecule structure assignment through computation of (1H and 13C) NMR chemical shifts”文章火爆网络,据作者看到的资料上看这篇论文自身的结果没有什么问题,但是,这篇论文附带了一份 Pyhon 程序,这个附带的 Python 脚本会出现一定问题。为了深入分析,作者第一时间下载了相关代码。
代码网址:
https://media.nature.com/original/nature-assets/nprot/journal/v9/n3/extref/nprot.2014.042-S2.zip
论文阅读:
https://www.nature.com/articles/nprot.2014.042

下面来带大家分析一下具体的情况。

BUG情况分析

从目前看到的资料上看,这个BUG出现在读入“Gaussian Output Files”,这个函数,在不同的操作系统下会有不同的输出结果。

640?wx_fmt=jpeg

如果读者也下载了相关代码会看到这篇论文本身带有For Python2和Python3两个套脚本,不过读取高斯输出文件的写法没有什么不同,分别在\nprot.2014.042-S2\Supplementary Data 2\Python Scripts (for Python v2)\nmr-data_compilation.py和\nprot.2014.042-S2\Supplementary Data 2\Python Scripts (for Python v3)\nmr-data_compilation.py的函数read_gaussian_outputfiles下,其函数具体内容如下:
def read_gaussian_outputfiles():	list_of_files = []	for file in glob.glob('*.out'):	list_of_files.append(file)	return list_of_files

从上述文件中我们可以看到这个函数是使用 glob.glob('*.out'):来添加相关文件的,这个函数本身没有任何排序的行为,而且从Main函数的情况看,其所有后续处理也全部是依赖read_gaussian_outputfiles函数的返回的,具体代码如下:
def main():	lofc = read_gaussian_outputfiles()	lofc_freq = read_gaussian_freq_outfiles(lofc)	lofc_nmr = read_gaussian_nmr_outfiles(lofc)	locs = prepare_list_of_chemical_shifts(lofc_nmr)	lofe = get_list_of_free_energies(lofc_freq)	lofe = boltzmann_analysis(lofe)	lofe = report_chemical_shifts(lofc_nmr, lofe)	summed_proton_shifts = final_proton_chemical_shifts(lofe)	summed_carbon_shifts = final_carbon_chemical_shifts(lofe)	lofe = count_imaginary_freq(lofc_freq, lofe)	write_final_shift_csv(summed_proton_shifts,summed_carbon_shifts)	write_master_csv(lofe)

那么这个 glob.glob函数是否会带排序功能呢,可以打开你\Python的根目录\Lib\glob.py来找到答案可以看到glob.glob函数的定义及官方说明如下,这个函数可以支持递归,但是没有说会自动排序。
def glob(pathname, *, recursive=False):	"""Return a list of paths matching a pathname pattern.	The pattern may contain simple shell-style wildcards a la	fnmatch. However, unlike fnmatch, filenames starting with a	dot are special cases that are not matched by '*' and '?'	patterns. 	If recursive is true, the pattern '**' will match any files and	zero or more directories and subdirectories.	"""

而且从这个glob方法的具体实现iterdir函数上看也没有进行排序,这个iterdir是靠os.scan来进行添加文件的。
def _iterdir(dirname, dironly):	if not dirname:	if isinstance(dirname, bytes):	dirname = bytes(os.curdir, 'ASCII')	else:	dirname = os.curdir	try:	with os.scandir(dirname) as it:	for entry in it:	try:	if not dironly or entry.is_dir():	yield entry.name	except OSError:	pass	except OSError:	return

那么再打开你\Python的根目录\Lib\os.py可以看到scandir其实就是系统调用,也就是说这个python脚本调用了glob.glob方法来读入文件,glob.glob方法就调用iterdir方法操作,而最终调用的os.scan又完全依赖于系统的行为。所以在不同系统中会有不同返回就可想而知了。

不过问题可以也不会像想象的那样严重,因为笔者在WINDOWS10和UBANTU18上对glob.glob方法进行测试的结果还都是对文件名升序排序的,也就是与预期一致。
640?wx_fmt=png
windows下的验证结果

640?wx_fmt=png

UBANTU18下的验证结果

后记

不过这个BUG也反应出学术界的一些问题,一是没有像GITHUB这样的开源平台,学界对论文复现,肯定不像IT业这么普及,二是非IT学术界的编程能力其实堪忧,但是目前很多论文都有关数据分析,还是需要一定的编程能力的,而且一旦某一顶级论文附带脚本出现BUG,其影响可能特别巨大。

版权声明:本文为CSDN博主「beyondma」的原创文章,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/BEYONDMA/article/details/102555199

换个姿势阅读?扫码试试~

640?wx_fmt=jpeg

(*本文为 AI科技大本营约稿文章,载请微信联系 1092722531


精彩推荐


2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

即日起,限量 5 折票开售,数量有限,扫码购买,先到先得!
640?wx_fmt=png

推荐阅读

  • 网红“AI大佬”被爆论文剽窃,Jeff Dean都看不下去了

  • AI大佬“互怼”:Bengio和Gary Marcus隔空对谈深度学习发展现状

  • 有了这套模板,再不担心刷不动LeetCode了

  • Google图嵌入工业界最新大招,高效解决训练大规模深度图卷积神经网络问题

  • 太鸡冻了!我用Python偷偷查到暗恋女生的名字

  • 苹果 5G 芯片“难产”

  • 【角度刁钻】如果把线程当作一个人来对待,秒懂

  • C 语言这么厉害,它自身是用什么语言写的?

  • 一文了解超级账本DLT、库、开发工具有哪些, Hyperledger家族成员你认识几个?

640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

C++中public、protect和private用法区别

Calsspig : public animal,意思是外部代码可以随意访问 Classpig : protect animal ,意思是外部代码无法通过该子类访问基类中的public Classpig : private animal ,意思是告诉编译器从基类继承的每一个成员都当成private,即只有这个子类可以访问 转载于:https://blog.51cto.…

TensorRT Samples: MNIST(Plugin, add a custom layer)

关于TensorRT的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/78469551 以下是参考TensorRT 2.1.2中的samplePlugin.cpp文件改写的通过IPlugin添加一个全连接层实现对手写数字0-9识别的测试代码,plugin.cpp文件内容如下&#xff1a…

AutoML很火,过度吹捧的结果?

作者 | Denis Vorotyntsev译者 | Shawnice编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】现在,很多企业都很关注AutoML领域,很多开发者也开始接触和从事AutoML相关的研究与应用工作,作者也是&#…

tomcat6 配置web管理端访问权限

配置tomcat 管理端登陆 /apache-tomcat-6.0.35/conf/tomcat-users.xml 配置文件&#xff0c;使用时需要把注释去掉<!-- <!-- <role rolename"tomcat"/> <role rolename"role1"/> <user username"tomcat" password"…

@程序员:Python 3.8正式发布,重要新功能都在这里

整理 | Jane、夕颜出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】最新版本的Python发布了&#xff01;今年夏天&#xff0c;Python 3.8发布beta版本&#xff0c;但在2019年10月14日&#xff0c;第一个正式版本已准备就绪。现在&#xff0c;我们都…

TensorRT Samples: MNIST(serialize TensorRT model)

关于TensorRT的介绍可以参考&#xff1a; http://blog.csdn.net/fengbingchun/article/details/78469551 这里实现在构建阶段将TensorRT model序列化存到本地文件&#xff0c;然后在部署阶段直接load TensorRT model序列化的文件进行推理&#xff0c;mnist_infer.cpp文件内容…

【mysql错误】用as别名 做where条件,报未知的列 1054 - Unknown column 'name111' in 'field list'...

需求&#xff1a;SELECT a AS b WHRER b1; //这样使用会报错&#xff0c;说b不存在。 因为mysql底层跑SQL语句时&#xff1a;where 后的筛选条件在先&#xff0c; as B的别名在后。所以机器看到where 后的别名是不认的&#xff0c;所以会报说B不存在。 这个b只是字段a查询结…

C++2年经验

网络 sql 基础算法 最多到图和树 常用的几种设计模式&#xff0c;5以内即可转载于:https://www.cnblogs.com/liujin2012/p/3766106.html

在Caffe中调用TensorRT提供的MNIST model

在TensorRT 2.1.2中提供了MNIST的model&#xff0c;这里拿来用Caffe的代码调用实现&#xff0c;原始的mnist_mean.binaryproto文件调整为了纯二进制文件mnist_tensorrt_mean.binary&#xff0c;测试结果与使用TensorRT调用(http://blog.csdn.net/fengbingchun/article/details/…

142页ICML会议强化学习笔记整理,值得细读

作者 | David Abel编辑 | DeepRL来源 | 深度强化学习实验室&#xff08;ID: Deep-RL&#xff09;ICML 是 International Conference on Machine Learning的缩写&#xff0c;即国际机器学习大会。ICML如今已发展为由国际机器学习学会&#xff08;IMLS&#xff09;主办的年度机器…

CF1148F - Foo Fighters

CF1148F - Foo Fighters 题意&#xff1a;你有n个物品&#xff0c;每个都有val和mask。 你要选择一个数s&#xff0c;如果一个物品的mask & s含有奇数个1&#xff0c;就把val变成-val。 求一个s使得val总和变号。 解&#xff1a;分步来做。发现那个奇数个1可以变成&#x…

html传參中?和amp;

<a href"MealServlet?typefindbyid&mid<%m1.getMealId()%> 在这句传參中&#xff1f;之后的代表要传递的參数当中有两个參数第一个为type第二个为mid假设是一个參数就不用加&假设是多个參数须要加上&来传递

实战:手把手教你实现用语音智能控制电脑 | 附完整代码

作者 | 叶圣出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;本篇文章将基于百度API实现对电脑的语音智能控制&#xff0c;不需要任何硬件上的支持&#xff0c;仅仅依靠一台电脑即可以实现。作者经过测试&#xff0c;效果不错&#xff0c;同时可以依据…

C++/C++11中左值、左值引用、右值、右值引用的使用

C的表达式要不然是右值(rvalue)&#xff0c;要不然就是左值(lvalue)。这两个名词是从C语言继承过来的&#xff0c;原本是为了帮助记忆&#xff1a;左值可以位于赋值语句的左侧&#xff0c;右值则不能。 在C语言中&#xff0c;二者的区别就没那么简单了。一个左值表达式的求值结…

Could not create the view: An unexpected exception was thrown. Myeclipse空间报错

转载于:https://blog.51cto.com/82654993/1424339

Banknote Dataset(钞票数据集)介绍

Banknote Dataset(钞票数据集)&#xff1a;这是从纸币鉴别过程中的图像里提取的数据&#xff0c;用来预测钞票的真伪的数据集。该数据集中含有1372个样本&#xff0c;每个样本由5个数值型变量构成&#xff0c;4个输入变量和1个输出变量。小波变换工具用于从图像中提取特征。这是…

快速适应性很重要,但不是元学习的全部目标

作者 | Khurram Javed, Hengshuai Yao, Martha White译者 | Monanfei出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;实践证明&#xff0c;基于梯度的元学习在学习模型初始化、表示形式和更新规则方面非常有效&#xff0c;该模型允许从少量样本中进行快速适应。这些方…

面试题-自旋锁,以及jvm对synchronized的优化

背景 想要弄清楚这些问题&#xff0c;需要弄清楚其他的很多问题。 比如&#xff0c;对象&#xff0c;而对象本身又可以延伸出很多其他的问题。 我们平时不过只是在使用对象而已&#xff0c;怎么使用&#xff1f;就是new 对象。这只是语法层面的使用&#xff0c;相当于会了一门编…

DNS解析故障

在实际应用过程中可能会遇到DNS解析错误的问题&#xff0c;就是说当我们访问一个域名时无法完成将其解析到IP地址的工作&#xff0c;而直接输入网站IP却可以正常访问&#xff0c;这就是因为DNS解析出现故障造成的。这个现象发生的机率比较大&#xff0c;所以本文将从零起步教给…

cinder存储服务

一、cinder 介绍&#xff1a; 理解 Block Storage 操作系统获得存储空间的方式一般有两种&#xff1a; 1、通过某种协议&#xff08;SAS,SCSI,SAN,iSCSI 等&#xff09;挂接裸硬盘&#xff0c;然后分区、格式化、创建文件系统&#xff1b;或者直接使用裸硬盘存储数据&#xff0…

Ubuntu 14.04 64位机上配置Android Studio操作步骤

Android Studio是一个为Android平台开发程序的集成开发环境。2013年5月16日在Google I/O上发布&#xff0c;可供开发者免费使用。Android Studio基于JetBrains IntelliJ IDEA&#xff0c;为Android开发特殊定制&#xff0c;并在Windows、OS X和Linux平台上均可运行。1. 从 htt…

大规模1.4亿中文知识图谱数据,我把它开源了

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;人工智能从感知阶段逐步进入认知智能的过程中&#xff0c;知识图谱技术将为机器提供认知思维能力和关联分析能力&#xff0c;可以应用于机器人问答系统、内容推荐等系统中。不过要降低知识图谱技术应用的门…

使用CSS 3创建不规则图形

2019独角兽企业重金招聘Python工程师标准>>> 前言 CSS 创建复杂图形的技术即将会被广泛支持&#xff0c;并且应用到实际项目中。本篇文章的目的是为大家开启它的冰山一角。我希望这篇文章能让你对不规则图形有一个初步的了解。 现在&#xff0c;我们已经可以使用CSS…

谷歌丰田联合成果ALBERT了解一下:新轻量版BERT,参数小18倍,性能依旧SOTA

作者 | Less Wright编译 | ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】这是来自Google和Toyota的新NLP模型&#xff0c;超越Bert&#xff0c;参数小了18倍。你以前的NLP模型参数效率低下&#xff0c;而且有些过时。祝你有美好的一天。谷歌Resear…

C++中extern C的使用

C程序有时需要调用其它语言编写的函数&#xff0c;最常见的是调用&#xff23;语言编写的函数。像所有其它名字一样&#xff0c;其它语言中的函数名字也必须在C中进行声明&#xff0c;并且该声明必须指定返回类型和形参列表。对于其它语言编写的函数来说&#xff0c;编译器检查…

Linux之tmpwatch命令

1、tmpwatch命令功能简介[rootvms002 /]# whatis tmpwatch tmpwatch (8) - removes files which havent been accessed for a period of... #删除一段时间内未被访问的文件tmpwatch删除最近一段时间内没有被访问的文件&#xff0c;时间以小时为单位&#xff0c;节省磁盘空间。…

你不得不知道的Visual Studio 2012(1)- 每日必用功能

2019独角兽企业重金招聘Python工程师标准>>> Visual Studio 2012已经正式发布&#xff0c;有很多花哨的新特性&#xff0c;也有很多方便使用者的新功能&#xff0c;当然也有负面声音。对于我们程序员&#xff0c;最关心的还是如何快速掌握VS2012&#xff0c;用于平时…

C++11中std::unique_lock的使用

std::unique_lock为锁管理模板类&#xff0c;是对通用mutex的封装。std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作&#xff0c;即在unique_lock对象的声明周期内&#xff0c;它所管理的锁对象会一直保持上锁状态&#xff1b;而unique…

为何Google将几十亿行源代码放在一个仓库?| CSDN博文精选

作者 | Rachel Potvin&#xff0c;Josh Levenberg译者 | 张建军编辑 | apddd【AI科技大本营导读】与大多数开发者的想象不同&#xff0c;Google只有一个代码仓库——全公司使用不同语言编写的超过10亿文件&#xff0c;近百TB源代码都存放在自行开发的版本管理系统Piper中&#…

小小hanoi

为什么80%的码农都做不了架构师&#xff1f;>>> View Code #include " iostream " using namespace std; int k 0 ; void hanoi( int m , char a , char b, char c){ if (m 1 ) { k ; printf( " %c->%c " ,a , c); return…