不过 Julia
里是有类型系统的,还有根据类型
parametric 的函数,利用这个东西也可以做出像 C++ 里的 Functor
一样的东西,从而使得在类似的场合可以实现内联。Dahua Lin 专门做了一个叫做
NumericExtensions
的扩展来处理这个问题。
回到我们刚才的例子,手写 for
循环的实现居然比向量化的实现慢了十倍左右,不过对于后面 report
的内存使用总觉得有点诡异,因为我们的 for
循环实现除了结果一个数字之外并没有使用任何临时变量的样子,倒是向量化的实现
dot_vec
应该是有中间临时结果存在的样子。最后一个是直接调用内置的
dot 函数,这应该是 call 到 BLAS 的矩阵运算库里去了,BLAS
里的操作都是经过各种精心优化过的,所以速度是最快的。
简而言之,即使是在 Julia
里,如果比较明显能用向量化操作的地方,通常向量化还是有优势的,因为会使用
里的高度优化过的矩阵运算代码,一般在矩阵维度比较大的时候优势比较能体现出来;反过来,即使是无法向量化的场合,直接在
Julia 里写复杂逻辑也不会像其他那些主流的 high-level
科学计算语言那么慢。有点略讽刺的是,有时候一些向量化的表达式会产生一些巨大的中间临时变量矩阵,反而影响性能,因此专门有一个
Devectorize
的扩展库来处理这样的事情……不过也许以后 Julia
的编译器能在临时变量的检测和消除方面做得更好一些的话这样的东西可能就不太需要了。
说起来 Python 虽然应该比 Matlab 和 R
要好一些,但是在这方面的表现似乎也不尽人意。在会被不断地调用很多很多次的那些计算用的代码片段上,经常会被用
Cython 之类的工具来将那一段用 C
重写,或者是使用 numexpr 或者更神奇的 Numba 之类的包来做定点优化,JIT 方面
PyPy 似乎也一直在努力的样子。
不过不管怎么说 Python 在科学计算 high-level
语言方面是占据了非常重要的地位的,其中最重要的原因是它无数的各种各样的库所形成的生态圈。所以即使
Julia 拥有各种让人兴奋的新特性并且在性能上各种完败 Python,要取代 Python
也不是一朝一夕的事,或者甚至是永远也不会发生的事。实际上,Python
的生态圈的强大程度,只要看它自己从 Python 2 过渡到 Python 3
都如此地举步维艰就不难理解了。就好像是即使你有三条龙,也必须得寻找盟友才能统一七国……唔,最近好像《冰与火之歌》看太多了,突然就想起来
King Robert 对 Ned Stark 说的“I have a son, you have a
daughter”……在这件事情上两个社区似乎已经达成一致,所以最近看到越来越多的合作趋势,包括
Python 和 Julia 的互相调用日趋完善,IJulia
差不多算是一个标志性的“Marriage”吧,就是将 Julia 作为 IPython Notebook
然后再回到 Julia 语言本身,它的发源地是
MIT,然后我最近发现那门口碑很好的 Parallel Computing 的课似乎就是用
Julia 来进行教学和实验的。它的有一些特性和另一个最近比较抢眼球的语言 Google Go
比较类似。一个方便的语言集成的基于 git
的扩展包管理系统,另外一个是异步、并行编程方面,Julia 里有内置的异步的
coroutine 以及多核并行调用支持。
另一个值得一提的特性是 multiple dispatch method,这个是在 Common Lisp
之类的语言里可以见到的特性。现在比较常见的 OO 语言使用的是根据
this 的不同可以具有多态性质,而 this
其实只是函数的第一个参数而已。multiple dispatch 则是更 general
的情况,不止看第一个参数,而是根据所有的参数的类型来共同决定调用“同名的”具体哪一个函数。这在定义诸如二元操作的时候更加
make sense
一些,例如“一个矩阵加上一个数”和“一个数加上一个矩阵”如果被考虑为“数”和“矩阵”各自的方法的话,总是有些奇怪的。
还有一个比较 handy 的特性是可以用诸如 2x
这样的方法来表达
2*x,这会使得数学表达式更简洁一些。而单从语言层面的话,最不得不提的应该就是强大的宏功能了。和
Lisp 一样,Julia 的代码本身是作为 Julia
里可操作的数据结构存在的,当然不是像 Lisp 那样的 list 结构,而是由
类型构成的一棵树。因此在宏里就可以做几乎任意的代码修改、转换、构造等等各种操作了。
当然了,作为一门实用的语言,除了语言本身的特性之外,周边的各种特性也是非常重要的。其中一个很重要的考察因素就是社区以及第三方库。这方面
Julia 还处于发展初期。但是在网上可以看到不少关于 Julia
的博客,大家纷纷表示对这个新事物非常 exciting,并且未来看起来非常
promising,所以如果你有想学习一下这门语言的话,动手来做一个你熟悉领域的扩展库应该是不错的选择。这里有一个目前已经有的库的列表。当然就我自己目前有的一点点经验来看,Julia
的社区也好,包括语言本身也好,也还在不断的发展中,有点麻烦的一点是现在资料也比较少,如果官方给的
manual 上觉得没有写清楚的话,能找的其他资料基本上就没有了。
最后就是 IDE 方面的功能。IDE
倒是并不一定要有,但是作为科学计算语言,方便的画图功能是必须要有的。目前已经有一些第三方扩展包在为
Julia 添加这方面的功能了,虽然由此引入 cairo
以及随之而来的各种依赖的包……至于调试和
profiling,(就我所知的范围内)在科学计算方面目前大家都比 matlab
差了一大截的样子。