前几年曾有Julia会替代Python的说法,现在看来,为时尚早,但作为科学计算方面的基于最新技术的强大工具,其优势已然显现,这意味着选择又多了一种。
在数据科学,乃至人工智能,以及其他相关领域,仔细对比Julia和Python这两者的表现会发觉: 对于同一目标,只要Python可以做的,Julia都可以做,而且效率高得多,语法也优雅了不少,只是名气过于逊色,接受度也太低。
在上述领域的实践中,对于编程语言的采用,最关心两个方面:好写和高效。前者在于迅速把想法和创意代码化,后者则要求较高的代码执行效率。在过去很长一段时间内,这两者是无法兼顾的: 比如C或C++等语言代码执行效率很高,但由于语法相对复杂繁重,代码产出比较低,而Python,R等易学好写,但执行效率要缓慢得多。尤其在海量数据,业务需求频繁和模型复杂的场景下,对协同和效率要求倍增,工具的选择着实令相关从业者不免纠结。
以上所谈涉及计算机科学界中所谓的“两种语言”的问题。幸运的是,随着编译技术的进展,在一定程度上对“两种语言”的问题有了些不错的解决方案,而Julia的出现便是应此运而生,该语言的创制始于2009年的麻省理工学院,至今的最新版本为1.5.0, 是一种面向科学计算的高性能动态高级程序设计语言,性能可与C和Fortran相媲美,代码风格与Python一般灵活,可以做到既高产又高效。
Julia的执行效率何以如此之高?
恰逢其时的编译器:高效 灵活
Julia是一种即时(Just-In-Time,JIT)编译语言,而不是脚本(解释)语言(如Python,R,Ruby等)。这使得Julia作为是一种动态的高级语言, 无需浪费时间走一趟解释器,就能被编译为可在CPU上直接执行的机器代码。同时也不像C语言那样,在运行前才能全部编译,因而具备更多灵活度和交互能力。
Julia使用LLVM(Low Level Virtual Machine)来进行JIT编译。具体过程是:Julia运行时会生成LLVM中间代码,并将其交给LLVM的JIT编译器,最终以其生成在CPU上可执行的机器代码。 其实,在LLVM中所构建的编译技术已经为Julia的代码优化建立了一套强大的工作系统: 既包含简单的操作,如循环展开或循环删除等;也涉及相对复杂的步骤,如SIMD向量化等。可见,是LLVM的存在促成了Julia在真正意义上的诞生。
然而,在Python和R的创制项目刚刚开始时,这种编译技术还不成型。现在,在Python和R社区中也有将LLVM编译技术引入以提升执行效率的项目,如Numba,Rllvm,都在不同程度上对性能有明显的提升,但由于这两种语言的种种历史遗留问题,截至目前,尚未在整体上达到其所期待的效果。
强健的类型系统(Types):井然有序 条理分明
进一步讲,Julia的类型概念是其性能高效的关键保证。 Julia编译器会主动推断程序中使用的所有数据的类型,并根据其参数的特定类型,编译不同版本的优化函数,这种范式被称为多分派(Multiple dispatch),贯穿于Julia运行之中。 比如,求开方的函数sqrt,在使用整数或浮点参数可以调用此函数时,Julia将编译两个版本的代码,一个用于整型参数,另一个用于浮点参数。 这意味着,最终在CPU执行机器代码时,不需要做任何类型判断的工作。粗略的说,可以认为是对诸如C++运算符重载方法的增充扩展和全面升级。
由于装备了周密的数据流算法和严谨的设计模式,Julia编译器可以在大多数程序执行之前推断出类型信息, 从这个角度来看,该语言非常适合于进行程序静态分析(Program Static Analysis)。简言之,类型推断和对应的代码专门化是Julia高效执行的重要策略,使Julia能够达到媲美C语言的运行速度,同时仍然保持着脚本语言的书写便利性。
需要多谈一点的是,除了这种类型推断机制,Julia编译器其实非常简单:并没有包括很多,像Java和JavaScript编译器所使用的--高级即时优化的技术,这是因为Julia编译器根本不需要,只要有了代码中数据类型的足够信息,就可以生成优化的直线式代码,可在CPU上直接运行。
在Julia中,由于类型系统非常周密详实,按照Julia的推荐模式写代码,通常可以达到很高的性能水准。
Julia的其他优势
正是有了执行效高效这个核心优势,才使得Julia的其他优势显得更有价值,于此暂列如下四点。
· 语法风格,完全沿袭的是脚本语言的传统,并有所优化,简言之:如果你觉得Python语法已经非常简单和明了,那么Julia的语法则是在这个基础上加一个“更”字,甚至是好多了。
· 学习成本:如果你觉得Python已经很容易学,学习Julia的难度只会变得更简单。
· 生态系统: 在统计学,数据科学和人工智能领域,现有的各种程序包,模型或代码框架完全可以同Python和R语言社区的功能模块对应,而且性能更高,风格也更优雅。
· 维护成本:由于Julia高效好写的特征,很多数据应用都可以完全由Julia一种语言来写,很少存在多种语言合作(如C/C++与Python)中的协调处理问题
以上每一条详细说来,都可以独立成文,但这不是本文的重点,只要考虑到Julia的出现,就是为了弥补Python等语言在数据科学等领域的不足即可,即使它并不是唯一有志于此的语言。
足即可,即使它并不是唯一有志于此的语言。
如果你用过Python或者R,那么不用多久便可以轻松的学会使用Julia来做那两种语言的工作,而且很快就会发觉,Julia真的是处处都把那两种语言使用过程中麻烦的地方,变得愈发简易,尤其是科学计算方面。而且就现在而言,如果能把这三种语言组合起来使用,你的工作真的可能变成艺术。
结语
至于Julia是否意在或能够真正在实际工作中替代Python,目前尚无答案,但在实际工作中的带来的益处,已经不容忽视。