使用Julia几周后的一些想法


Julia入门的一些记录。

这几年,我重度使用过的编程语言大概包括Matlab、Python、C/C++, 其他的诸如FORTRAN、C#、Bash、R、JAVA之类只是在闲暇的时候尝试过,然后能够copy一些代码。

对于Matlab,主要是之前的实验室大部分已有代码是Matlab,最开始当然只能用Matlab。 我个人感觉其最重要的优点主要就是Matlab本身的调试功能,任意位置断点, 然后中断后,在当前变量区内任意运行代码。 但是Matlab太大,而且正版太贵了,所以在基本了解要做了什么之后, 大部分后续数据处理全部由Python完成。

选择Python最主要的是已有的轮子太多太多了,基本上我需要的绝大部分都已经有人写好了, 只需要很小的改动,甚至不需要改动直接import就行。 numpyscipypandas,再加上matplotlib, 基本上科学计算以及相应的数据处理成图,可以完成绝大部分任务了。 而C++主要是需要用些相关的代码,然后运行速度够快。

当然在同时使用Python和C++的时间里面。 逐步有一些对Python的不满,主要集中在运行速度上。 另外就是关于变量的,我想要一套清晰准确的变量类型系统, 并且每个变量的作用域要尽量小,比如循环里面定义了一个变量,循环外最好不可见。 当然最好不要像C++的必须完整编译后才能运行。

以上这些,在之前也不是什么问题,主要是之前的基本都是小区域的数据, 运行一次,也不算太久。 但是最近拓展了区域之后,发现有点接受不了Python的运行速度, 并且了解到Julia的版本号已经不是0开头了, 就试着用Julia写了一些简单的代码,感觉上已经基本可用了。 这里主要记录一下,个人使用几周后的感觉。

速度。相比Python,这个的优势应该算是比较突出的。不过这个是需要分不同情况的。 首先Julia运行前是需要编译的,这个时间看代码量,一般在几秒的量级, 所以如果运行一些简单的,能在几秒内就能完成的功能, Julia的优势并不明显。 而且对比Julia,我发现Python在使用numpy后,处理数量在10e7以上后数据时,反而更快, 这个我看到的解释是conda下会有一些多核的加速(?)。 不过对于需要处理的单个数据都是在10e4到10e5量级内,还是Julia最快。

变量。Julia本身声明赋值变量的时候不需要说明变量类型,而是Julia通过赋值语句来确定。 不过Julia包含一整套精确的类型系统。 同时变量的作用域与C++基本一致,使用过程中确实很舒服。 不需要像Python中一样小心翼翼地确保变量名不会指向奇怪的地方。

多重派发。这个是基于Julia本身准确类型系统的显然特征。 主要是相同函数名(应当是指向相同的操作逻辑), 可以根据不同的参数类型进行匹配。 这个是函数式编程的重要特点,但是我还不是很了解, 仅仅在感觉上与C++中模板比较类似。 在实际使用中,确实相比Python要舒服一点。

不过Julia作为一门发布不是很久的语言,生态还是问题, 很多时候需要的功能都没有,不过在了解了一些Julia调用C/C++、Python程序的过程后, 觉得应该都不是问题。 对于C/C++程序,编译成so或者dylib文件,直接ccall,由于Julia本身就有准确的类型系统, 在调用的时候非常顺畅。 而Python,可以说,Julia中使用 PyCall,可以调用所有Python包, 目前我需要使用的包,在 pyimport 之后,没有发现任何问题。 同时由于Python包基本都是开源的,所以在速度不够的情况, 也可以直接重写成Julia,还能增加对使用Python时没有关注的一些底层操作的认识。

简单来说,了解C/C++和Python的话,绝对应该试一试Julia,可能会有惊喜。