精进Excel
如果任意点开三篇,没有你想要的知识,算我耍流氓!
原文作者:Jeffrey M. Perkel
研究者常常面临着使用一种编程语言来写代码,之后再用一种更快的语言重写的窘境。一种新的编程语言可以解决这个难题。
在做气象建模的时候,每秒的计算时间都很重要。这些模型中需要考虑到空气、土地、太阳和海洋,以及它们之间复杂的物理联系。一个模型可能会有数百万行代码,在世界上最强大的计算机上执行。因此,气候建模联盟(CliMA)——美国的一批科学家、工程师和数学家组成的联盟——的气候学家在从零开始为模型写代码的时候,就选择了一种能满足他们需求的语言:Julia。
插画:The Project Twins
Julia于2012年发布。这是一种开源的语言,将脚本语言(例如Python,Matlab和R)的交互性和语法与编译语言(例如Fortran和C)的速度结合到了一起。
在气候科学家里,通用语是Fortran:快速,但是——由于它的历史可以追溯到1950年——并不是很吸引人。美国海军研究生院的数学家,也是CliMA的主管之一Frank Giraldo说:“很多人听到Fortran的时候就一脸‘天啊,我可不想写那玩意儿’的表情。”年轻的程序员更喜欢那些可以使用最时髦的软硬件设计模式的编程语言,他说,而自从使用了Julia,他看到大家的兴趣越来越浓。“有些人是真的对气候模型感兴趣,其他人的兴趣则在用Julia做大规模应用上。”他说。
正在加州理工大学学习材料科学的Jane Herriman说,自从她用Julia重写了自己的Python程序之后,运算速度提升了十倍。墨尔本大学的系统生物学家,自称“Julia传教士”的Michael Stumpf将R语言的模型以Julia重写,运算速度提升了800倍。“以前要跑好几周甚至几个月,现在一小时就跑完了。”他说。
性能的大幅提升,加上Julia亲民的语法和解决“语言转换”问题的承诺(研究者们通常需要用Python这类用户友好的语言写代码原型,之后再用一种更快的语言重写),让这种编程语言名声鹊起,特别是在计算量较高的领域里。除了气候模型之外,人工智能、金融和生物信息这些学科也开始改用了它。
根据麻省理工学院的计算机科学家,也是Julia的创始人之一Alan Edelman的说法,Julia至今已经有900万下载量了。一份数据显示,它已经进入了全世界最流行的编程语言前50名。虽然还是较为小众——2019年Julia排行第50,而Python是第3——但它有着热情的用户群体。
“大家对重写代码已经厌烦了。”Edelman说,“需要写不明所以的代码很烦,别人或是研究生或是同事写完代码就换工作留下一大堆不知道该怎么处理的代码很烦。正是这些人改用了Julia——他们想要性能、可移植性和灵活性。”
两全其美
Julia——它和Python、R一起构成了数据科学家们所喜爱的交互式计算文档系统“Jupyter”——本质上是一种披着脚本语言皮的编译语言。在Python这样的脚本语言中,用户往一个可交互的编辑器里面一行一行敲代码,然后就会直接解释执行,并立刻返回结果。在C和Fortran这样的语言里,代码必须先编译成为机器可读的指令,然后才能执行。前者更容易使用,而后者的代码执行速度更快。因此,如果执行速度比较重要的话,程序员就常常需要先用脚本语言开发算法,再翻译成C或者Fortran。这种流程相当繁琐,且容易出错。
Julia避免了这个“语言转换”问题,因为它执行原理和C类似,而语法则和Python类似。它还包含了一些内建特性,用来加速对计算量要求较高的问题,例如分布式计算(即允许程序员将困难的问题分拆到多个处理器或计算机来解决的功能)。倘若没有Julia,这可能需要用多种语言才能写成。马里兰大学的量化临床药学家Vijay Ivaturi用Julia写了一个工具,用来辅助自己决定药品剂量。他之前所使用的语言Fortran则必须使用好几种辅助工具。“我爱上了Julia的速度,”他说,“但最重要的是,我觉得我爱上的是不需要换几种语言就能干完活:从头到尾,我只需要一个开发环境就行了。”
用户在Julia里写代码通常会使用REPL(读取-求值-输出循环)界面。这是一个交互性的文字界面,读取输入,求值,然后将结果输出给用户。(也可以使用标准的编程用文字编辑器,或是Jupyter Notebook。)在表面上,Julia和Python是完全一样的:输入一行命令,看到结果。但是在背景里,语句经过了编译。因此,第一次写下一个函数的时候,运行起来可能会慢,但是接下来再运行就快了。一旦代码能够正确运行之后,用户就可以进一步优化它(见“开始使用”)。
开始使用
搭建环境
Julia: julialang.org
Juno,一个免费的Julia语言“集成开发环境”,其中包括代码编辑器,调试工具和交互界面:junolab.org
调试器:go.nature.com/2jdfr5g
IJulia,使用Jupyter写Julia代码的内核: go.nature.com/2jldaj2
扩展包:go.nature.com/30brtxe
使用指南
julialang.org/learning/
Julia语言文档:go.nature.com/2nxrqup
Julia的思考方式:go.nature.com/2y7skii
获取帮助
Slack: julialang.slack.com
Discourse: discourse.julialang.org
Gitter: gitter.im/JuliaLang/julia
一个可交互执行的Julia文档,包括一些关键特性:go.nature.com/2lxllfd
根据Giraldo的说法,CliMA为他们的项目选择Julia的一个理由是一次圣诞节的编程竞赛上Julia的出色表现。当时Julia与C和Fortran正面对决,Giraldo作为小白鼠上场了——当时他还是Julia新手。“直接用Julia写出来的代码就只比高度优化过的Fortran代码慢几个百分点。”
而且更加可读,他补充说。由于Julia有着多重派发(允许不同函数使用相同的函数名)和元编程(允许程序修改自身)等特性,因此十分简洁。Julia还支持Unicode符号,因此程序员可以使用希腊字母做变量名,而不一定必须使用拉丁字母转写。也就是说,他们可以写出和论文里的数学公式一样的代码,例如计算圆周率时使用C = 2*π*r而不是C = 2*pi*r。“你可以把脑子里想到的东西直接写下来。”Edelman说,“最好是让机器迁就你,而不是你迁就机器。”
更快、更强、更简单
哥本哈根大学生物多样性的研究者Michael Borregaard说,和R相比Julia让他的代码快了两个数量级——计算速度和程序清晰度上都有受益。“写Julia让我能够更简单地优化速度,或是重新思考实现方式,让它变得更快。”他说。
对罗德岛妇女婴儿医院的临床研究助理George Tollefson来说,Julia对用户友好和计算效率的兼重让它成为了编写大型基因组数据集的数据界面的理想语言。“Julia最开始就很有吸引力,因为它又快又强大。”他说,“但是写起来却十分简单。”而且它还有一个乐于助人的社群,Tollefson补充道。因为这种语言的用户群体比较小,因此想要在网上找到答案可能会有困难。但是Slack、Discourse和Github上的开发者社群可以弥补这个缺憾。“有时我们发现别人没有遇到过[和我们一样的]问题,但是他们半小时内就能帮我们解决。”Stumpf说。
但是,用户群小也意味着扩展包比较少——扩展包是程序员在新的领域使用一门语言时所使用的外部代码库。Edelman说,Julia的生态系统有不到2600个扩展包,其中包括Flux(机器学习),BioJulia(DNA测序分析)、DifferentialEquations(计算模拟)和JuMP(数学建模)。相比而言,CRAN R语言库有超过14000个扩展包,而Python的PyPI里有超过187000个扩展包。
如果研究者需要一个没有转写进Julia的代码库,可以使用Pycall(对应Python)或Rcall(对应R)这样的插件来直接使用代码。哈佛大学计算机系研究生Lydia Krasilnikova此前在麻省理工学院读本科的时候写了一个Matlab到Julia的翻译器,可以在网上找到。“很多人给我发信说这个翻译器简化了他们转换的过程,并允许他们在Julia中测试代码,然后修改原有的代码库。这是他们以前做不到的。”她说。
说到底,编程语言的选择还是要看个人偏好、项目需求和同事。很多情况下,任何编程语言都能用。但要是想用“高效的代码”,Giraldo说:“那么,说实话,我现在觉得Julia就是最好的选项了。闷头研究一下就好。其实一点也不难。”
原文以Julia: come for the syntax, stay for the speed为标题
发布在 2019年 7月 30日《自然》工具箱上
领取专属 10元无门槛券
私享最新 技术干货