新风向标:学术界开始从 Python 转向 Rust

作者 | Jeffrey M. Perkel
策划 | Tina
来源 | Rust语言中文社区
Rust 现在已经越来越受到科学家们的欢迎了,比起 Python,Rust 有着更高效的性能,同时在社区建设方面也让用户体验更舒服。虽然学习难度大了些,但综合下来,越来越多的科学家认为时间花的值。
2015 年,德国生物信息学家约翰内斯·科斯特 (Johannes Koster) 曾用 Python 编写了一个广受欢迎的工作流管理器 Snakemake。作为大家公认的“Python 专家”,目前他正在筹备一个新项目,该项目对性能要求较高,而他认为 Python 无法提供该项目需要的计算性能。因此,他开始寻求一种新的编程语言解决方案。
Koster 现在在德国杜伊斯堡 - 埃森大学工作,他对这门新语言解决方案的要求是:既要能提供 Python 的“表达能力”,也要拥有 C/C ++ 的运行效率。用他自己的话来说,它需要是“一种符合人类使用习惯,同时又具备高效性能的语言”。最终他选用的语言就是 Rust 。
Rust 最初于 2006 年由 Mozilla 工程师 Graydon Hoare 创建。Rust 融合了 C++ 语言的性能与其他高级语言优秀的语法特性,对代码安全性问题也进行了特别的处理,Mozilla 的火狐浏览器有一部分就是用 Rust 编写的,微软也正在用它重新编码 Windows 操作系统的部分内容。Rust 已连续 5 年在 Stack Overflow 开发者年度调查 (今年调查了将近 65000 名程序员) 中被评为 Stack Overflow “最受欢迎的” 编程语言。GitHub 上的数据也显示,Rust 是 2019 年平台上增长第二快的语言,比去年同期增长了 235%。
而在科学研究界,科学家们也正在转向使用 Rust。例如,Koster 利用 Rust 创建了一个名为 Varlociraptor 的应用程序,该程序将数百万个基因序列读数与数十亿个遗传碱基进行比较,以鉴定基因组变体。“这个项目的数据量是巨大的,”他说,“所以对性能的要求极高。”不过想要获得这样的性能也是需要付出一定的代价的:Rust 的学习困难度较大。
“使用 Rust 确实需要一些前期的学习时间,”卡罗•尼科尔斯 (Carol Nichols) 说。她是 Rust 核心团队的成员,也是位于宾夕法尼亚州匹兹堡的咨询公司 Integer 32 的创始人。“但它能帮我做一些我不能做的事情。我认为这段时间花得很值。”
1避免无规则
通常情况下,当工作流中涉及到分析科学数据时,大家都倾向于选择使用 Python、R 和 Matlab 等语言。这些语言会逐一解释代码行,然后执行,这种编程风格有利于研究数据,但速度慢。
C 和 C++ 执行效率很高,但是他们“没有规则”,Ashley Hauck 说,他是斯德哥尔摩的一名 Rust 程序员 (在社区中人称“Rustacean”)。例如,没有任何措施可以防止 C 或 C++ 程序员错误地访问已经释放回操作系统的内存,或者避免程序两次释放同一块内存。仅仅是导致程序崩溃还好,最糟糕的是,它还可能返回无意义的数据或暴露安全漏洞。据微软的研究人员称,该公司每年修复的漏洞中有 70% 与内存安全有关。
2遵守设计规则
Rust 的模型可以根据规则将每一块内存分配给单个所有者,并强制控制访问权限。违反这些规则的代码也不会导致崩溃,因为它们不会被编译到。马里兰大学帕克分校的计算生物学家 Rob Patro 解释说:“它们有一个基于生命周期概念的内存管理系统,该系统让编译器在编译时跟踪内存的分配、释放、谁拥有它、谁可以访问它。”“得益于语言的设计方式,大量的错误在编译阶段就会被消除。”
这样的设计也有利于在多个处理器上运行软件的安全性,比如,可以消除多个计算线程同时访问相同数据的可能性。
Rust 比较容易维护和调试,但难于学习掌握。“其它主流语言都没有这些概念,理解了这些概念才是真正明白如何使用 Rust 编写代码的真正核心。”Nichols 说。Stephan Hugel 在都柏林三一学院研究地理数据的可视化,他自己花了两到三个月的时间移植 Python 算法,将地理空间坐标从一个参考系统转换到另一个参考系统,从而使执行速度提高了四倍。加州拉霍亚市的化学信息软件公司 Metamolecular 的创始人理查德•阿波塔卡说,他花了大约六个月的时间才精通这门语言。
3关注用户使用体验
“为了提高语言的影响力,Rust 开发人员着重对用户体验进行了优化。”Manish Goregaokar 说,他是 Rust 开发人员工具团队的负责人,现居加州伯克利。例如,编译器会产生信息特别丰富的错误消息,甚至会突出显示出错的代码并给出修复建议。Goregaokar 解释说:“既然给语言引入了一个新的功能概念,那么使用起来就要让人感到舒服。”
Rust 社区还提供了丰富的文档支持和在线帮助,其中包括一个名为 The Book 的在线参考文档和一个罗列常见问题的“Cookbook”问题列表。用户对 Rust 的工具链还是比较满意的,程序员可以用它来将代码转化为应用程序 (可参考下文中的“构建 Rust 应用”)。“关于 Rust 的工具和基础设施建设完善度确实让人感到惊奇。”Patro 说。与程序员用来构建 C 代码的许多编译器和辅助工具不同,Rust 开发者可以使用一个叫做 Cargo 的单一工具来编译 Rust 代码、运行测试、自动生成文档、上传包到存储库等等,它还可以自动下载和安装第三方软件包。使用一个名为 Clippy 的第三方插件还可以标记常见错误和不建议使用的 Rust 代码,Patro 非常喜欢该工具。
构建 Rust 应用
下面介绍如何创建一个 GenBank 文件阅读器,以便你进一步了解 Rust 的特性。
下载安装 Rust:www.rust-lang.org/learn/get-started
克隆 GitHub 上的代码:https://github.com/jperkel/gb_read
执行‘cargo run’命令下载外部依赖项并构建应用程序。默认情况下,应用程序会解析 GitHub 仓库中 GenBank 文件 'nc_005816.gb'。你也可以使用“cargo run ”来指定一个输入文件。
使用“cargo test”执行单元测试。
使用“cargo doc -open”创建和查看文档。
Rust 还为常用的开发环境提供了 Rust 插件,比如微软的 Visual Studio Code 和 JetBrains 的 IntelliJ,它还为 Rust playground 提供了一个实时的、在线的 Rust 开发环境。澳大利亚悉尼的软件开发人员大卫拉蒂摩尔 (David Lattimore) 还创建了一个在 Jupyter 计算笔记本中使用 Rust 的“内核”,以及一个名为 REPL( read-evaluate-print loop) 的 python 风格的交互环境。
Rust 的第三方软件包生态系统可以辅助软件开发,目前第三方库数量已经接近 50,000(参见下图“Rust rising”)。它们封装了诸如生物信息学 (Koster 's Rust-Bio)、地球科学 (the Geo-Rust project) 和数学 (nalgebra) 等学科的算法。尽管如此,Nichols 说,“如果你需要的库在 Rust 中没有,那肯定就会让人感觉不爽。”不过,程序员有时可以使用 Rust 的“外部函数接口”来弥补这一差距。

4Rust 代码优势
除了编码流程之外,更需要特别说明的是 Rust 的高效性能。今年 5 月,马萨诸塞州波士顿市达纳法伯癌症研究所 (Dana-Farber Cancer Institute) 的生物信息学家李衡 (Heng Li) 在一项计算生物学任务中测试了多种语言,该任务涉及解析 570 万份序列记录。Rust 超越 C,稳居榜首。“当你想要使用多线程编写高性能程序时,如果你需要它性能非常快,同时内存也很紧凑,那么 Rust 是理想的选择,”李说。
加州大学戴维斯分校的生物信息学家路易斯·艾贝尔说,用 Rust 重写了一个叫 Sourmash 的工具软件,它的主要功能是执行基因组搜索和分类分析,改用 Rust 后可以减少软件维护成本,使用较先进的现代语言特性,同时程序还可以通过 web 浏览器访问。他说。
Patro 的团队成员 Avi Srivastava 实习归来后,在研究生 Hirak Sarkar 的带领下,利用 Rust 构建了一个名为 Terminus 的基因表达分析工具,Avi Srivastava 之前在位于美国加利福尼亚州普莱森顿的一家生物技术公司 10x Genomics 实习,在那里他使用 Rust 开发开源工具。现在在纽约基因组中心工作的 Srivastava 解释说:“Rust 的优势在于高效的任务调试,因为 Rust 的内存管理做的非常好。”
对于许多 Rust 开发者来说,社区氛围因素也非常重要。Hauck 是 LGBT+ 社区的一员,她说 Rust 的用户已经用他们的方式让她感受到了热情。她说,“这个社区一直在坚持包容性,他们非常清楚多样性对事物的影响,非常清楚如何制定和执行行为准则。”。
“这可能是我仍然在使用 Rust 的原因,”Hauck 说。“它的社区建设太棒了。”
参考链接:
https://www.nature.com/articles/d41586-020-03382-2







本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
新风向标:学术界开始从 Python 转向 Rust的更多相关文章
- 说说这篇「我为什么从python转向go
作者 CMGS2015.05.17 15:47* 写了7891字,被143人关注,获得了97个喜欢 说说这篇「我为什么从python转向go」 字数3748 阅读24227 评论21 喜欢81 恩看了 ...
- 我为什么从python转向go
应puppet大拿刘宇的邀请,我去西山居运维团队做了一个简短分享,谈谈为什么我要将我们的项目从python转向go. 坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压 ...
- Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS)
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占优势
美国时间3月4-8日,国际知名信息安全峰会RSA Conference在美国旧金山开幕,云安全及云可以为企业提供更可靠的资产管理方式成为大会热点. 此次峰会共吸引全球700多家机构参展,其中近42%为 ...
- Rust语言
Rust语言 https://doc.rust-lang.org/stable/book/ http://www.phperz.com/article/15/0717/141560.html Rust ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- V语言横空出世,C/C++/Java/Python/Go地位不保
V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...
- Rust学习笔记一 数据类型
写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...
- 一个简单的rust字符串时钟
1.简介 用rust写的一个简单的练手的demo,一个字符串时钟,在终端用字符串方式显示当前时间.本质是对图片取灰度,然后每个像素按灰度门限用星号代替灰度值,就把图片变为由星号组成的字符型图案.把 ...
- 性能的极致,Rust的加持,Zed-Dev编辑器快速搭建Python3.10开发环境
快就一个字,甚至比以快著称于世的Sublime 4编辑器都快,这就是Zed.dev编辑器.其底层由 Rust 编写,比基于Electron技术微软开源的编辑器VSCode快一倍有余,性能上无出其右,同 ...
随机推荐
- Mybatis分页插件PageHelper的配置及使用方法
尊重人家的知识成果 推荐 该作者总结的不错! --->> --->> @author 扎心了老铁 Mybatis分页插件PageHelper的配置及使用方法
- python3常用模块和方法
1.使用索引反转字符串 str="hello" print(str[::-1]) 2.zip函数获取可迭代对象,将它们聚合到一个元组中,然后返回结果.语法是zip(*iterabl ...
- selenium的准备工作
1.安装python 默认无脑安装 勾选添加到path环境变量 安装成功后的展示: 2.安装pycharm 创建项目 并且把pycharm与python关联起来 3.在当前项目下下载selenium( ...
- 通俗易懂的spring事务的传播机制讲解!
spring事务理解 前提两个都是事务的方法,并且两个方法会进行调用,调用方统一使用required 举例有两个方法: required 如果当前上下文存在事务,被调用方则加入该调用方的事务,没有的话 ...
- Thread 线程中的 Synchronized block and lock
Thread Definition of Synchronized Synchronized block in java are marked with the synchronized keywor ...
- InnoDB 是如何解决幻读的
前言 大部分人在日常的业务开发中,其实很少去关注数据库的事务相关问题,基本上都是 CURD 一把梭.正好最近在看 MySQL 的相关基础知识,其中对于幻读问题之前一直没有理解深刻,今天就来聊聊「Inn ...
- 单元测试、文档测试、读写文件、StringIO和BytesIO
1.单元测试就是为了测试程序执行的正确性 2.编写单元测试时,需要编写一个单元测试类,继承unittest TestCase类 3.单元测试最常用的断言是assert,断言期望抛出指定的异常 4.运行 ...
- 自用纯C语言实现任务调度(可用于STM32、C51等单片机)
前言 这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟 ...
- SpringBoot整合RocketMQ,老鸟们都是这么玩的!
今天我们来讨论如何在项目开发中优雅地使用RocketMQ.本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分解决在使用RocketMQ过程中可能遇到的一些问题并解决他们 ...
- xtrabackup+MySQL8全备+增备脚本
问题描述:运用xtrabackup进行mysql全备,mysql8之前使用的是innodbxtrabackup,mysql8之后开始使用xtrabackup,innobackupex把功能都集成到xt ...