【数理】惊讶:面向科学计算的语言——Julia

  1. 介绍文章:让高性能计算人人可用 csdn.net/article/2014-03-12/2818732
  2. julia 官网: julialang.org/
  3. 中文使用手册 julia-cn.readthedocs.org/en/latest/
    :scream:
    “像 C 语言一般快速而有拥有如同 Ruby 的动态性;
    要具有 Lisp 般真正的同像性(Homoiconicity)而又有 Matlab 般熟悉的数学记号;
    要像 Python 般通用、像 R 般在统计分析上得心应手、像 Perl 般自然地处理字符串、
    像 Matlab 般具有强大的线性代数运算能力、像 shell 般胶水语言的能力,易于学习而又不让真正的黑客感到无聊;
    还有,它应该是交互式的,同时又是编译型的……”

在网上看了一些文章,有部分国内用户已经开始使用、研究这个语言了,而且还给出了很高的评价,
甚至连中文手册都给出了;而在国外的社区十分活跃。
莫非 Octave、Scilab、R 、Maxima 要退役了?貌似 Fadora 有安装包了:下载页面: julialang.org/downloads/ (0.31 版)

目前我安装了 windows x64 版本,32M 的包安装后变成了 430+M,据闻是调用了大量优质数学函数库,属于即时编译型的语言

不知道有没有人尝试过这个传说中的计算语言。

至 openSUSE 13.2 版 f 发布这个软件已经进入工厂版。

2赞

听说过,没尝试。 身边没有人用。

我准备用 F#,哈哈……

额,julia 这是科学计算的语言啊,不是用来编写软件的(虽然也可以)

F# 也可以科学计算啊。 .Net 平台,有统计软件包,可以调用 R 语言函数……

现在有很多科学家都用 Python 了

F# 也可以科学计算啊。 .Net 平台,有统计软件包,可以调用 R 语言函数……

现在有很多科学家都用 Python 了

F# 不是专门为计算设计的,你对比一下 julia 的特性,R 太慢而且统计只是计算里的一部分,python 是很强但也是比较慢的,很多专用的数学函数、高性能代码都集成到 julia 里面了,而且目前看它发展得很好,下一个版本就支持 3 维绘图了,也会有一个新的 UI。
附图是集中语言的性能对比,C 语言是 1,最快是 fortran,julia 几乎达到了 C 的速度,重点是它比 C 更专注于数学科学


F# 不是专门为计算设计的,你对比一下 julia 的特性,R 太慢而且统计只是计算里的一部分,python 是很强但也是比较慢的,很多专用的数学函数、高性能代码都集成到 julia 里面了,而且目前看它发展得很好,下一个版本就支持 3 维绘图了,也会有一个新的 UI。
附图是集中语言的性能对比,C 语言是 1,最快是 fortran,julia 几乎达到了 C 的速度,重点是它比 C 更专注于数学科学

[attachment=0]捕获.PNG[/attachment]

F# 的速度也很快……
支持 Visual Studio 啊

速度我就不清楚了,没用过这个语言。 但是语言的速度是个很纠结的事情。 比如说 Python 吧,你用 Python 写一个 fib 函数那确实慢。 但是 Python 你可以写一个 library 啊,里面包含 fib 函数,而这个函数你可用 fortran 实现。 现在 python 里的一些科学包好像就是 Fortran、C 之类的实现的。 那这种情况下你这个 fib 的速度就非常快了。

他的比较标准是不明的……

你是学计算机的当然可以学习 F# 之类啦,几乎任何语言都能科学计算,编程高手根本不需要像我们理科
专门挑简单而有效(计算)的语言学习;就算 F# 再快,但我理科的宁愿学习 Fortran,Python 都不会去学习它的。。。。

测试实验就是使用 python 的数学库 numpy 或者 Python 本身计算的(每一项都说明了),如果向量用 Python 计算那速度简直惨不忍睹(PS:Python 确实是一个很优秀的语言但本身不适合大规模计算)。而且官网已经说明了任何人觉得不服的可以将测试的代码优化再来测试,所以测试的结果应该是可以信服的。

julia 的数学库有很多与 Python 是相同的,但有些用 julia 本身写的数学库,这是 Python 所不及的。当然,由于 Python 的胶水特点,它到时候也可以集成 Julia 所有的数学库以及绘图库(事实上已经有一个叫 IJulia 的计划就是集成 Ipython 与 Julia),但 Julia 的即时动态编译器,是 Python 的解释器所不及的。

我不是编程高手。 确实任何语言都能科学计算,因为所有图灵完备的语言在计算能力上都等价于图灵机。

但是你怎么知道 F# 不简单? 我不知道你从哪里得出“F# 不简单”甚至于“Fortran 都比 F# 简单”这个想法的? 因为 F# 是微软出品的?

F# 的速度倒是很有争议,有人说很慢,也有人写出来很快…… 但是我不认可你直接判定他难的观点。

至于发展 Julia 肯定发展地比 F# 好,因为学缘。

我没有说 F# 难哦,不能这么推断我的话呀(好吧莫非我的表达有问题),我只是说挑简单高效的语言计算而已(很明显 F# 不符合后者)
不过呢你这么一说我倒是真的这么认为了,因为它在科学计算方面就是不简单不高效………
毕竟是微软为了自家的生态而发明的语言。论编程 Fortran 应该比 F# 难,但在计算方面它是高效的。
所谓寸有所长,尺有所短嘛。好吧,这个议论可以结束了。

Fortran 和 F# 就不是一个时代的语言。和 Julia 也不是一个时代的语言。Fortran 几乎是最高效的语言,但是很多人还是用 Matlab、R 而不是 Fortran。

我是没计划去学 Julia,虽然早就看过了。 我觉得学术圈制造了很多垃圾软件,大部分都是一个有导师 - 学生组成的学缘关系(类似于周朝宗法制血缘关系)集团内部的一个“自留地”,搞出一堆玩意儿,我连安装都不想装……

另外我不是学软件开发的。

你前面说 F# 就算很快,那也不简单,后来又说就算编程简单,那计算就一定不高效……

唉,总觉得你喜欢推断,误解我的意思(例如前面我没说 F# 难,你就结合下文认为我觉得F#难),难道我的表达真的这么反人类 T_T,看来我要去学习一下逻辑与哲学了。
再者,你理解错我的“高效”了,我所指的高效不仅仅是说编译或者速度多快,而是 易于学习编写,运算快速的综合考虑。

Julia 已经开发了 5 年了,在 12 年被评为年度软件,它的计算能力已经得到了认可,已经可以实际使用了,它对矩阵处理仅仅略次于 Matlab(因为 Matlab 使用了 Intel 的商业数学库)Matlab、R、Fortran 都很好,但它们都有一些缺陷,而 Julia 的设计初衷就是为了解决这些缺陷。例如 Matlab 对非向量的处理能力差,解释器慢;Fortran 没有动态而且代码复杂;R 慢且仅仅在统计方面擅长;所以 Julia 有了动态编译器,可以直接调用 C 与 Fortran 等特点。

但是 Julia 的稳定性、可靠性还未得到认可,应用也不够广泛,到底是不是垃圾只能靠时间来验证了。但是如果喜欢编程计算,在日后要处理大量数学问题而又不愿意学习 Fortran 的话,我觉得 Julia 是值得关注的。

你不能根据你以往对的某一些认识就对 Julia 下判断,要真正了解还是要去学习或者去社区询问—而不是用其他不成功的项目来看它,现在外国社区还算活跃,除了计算,目前有人用它设计了一些小程序甚至网页。还是那句话,它好不好要靠时间来验证。

我也不是学软件的,所以我对语言认识很有限,如果我说的话太肤浅的话希望多多海涵。

觉得你认为难,是因为你说你不是编程高手,便成功高手想学什么都能学云云的

另外在美国学术圈小小接触之后,感觉水还是很深的。 里面 有论文利益之类的。

还有我看了一下 Julia 写的 python 排序代码。

def qsort_kernel(a, lo, hi):
i = lo
j = hi
while i < hi:
pivot = a(lo+hi) // 2]
while i <= j:
while a* < pivot:
i += 1
while a[j] > pivot:
j -= 1
if i <= j:
a*, a[j] = a[j], a*
i += 1
j -= 1
if lo < j:
qsort_kernel(a, lo, j)
lo = i
j = hi
return a

我从他的测试代码里复制的。 我就问问为什么不直接用内置的排序函数?
真的性能很好,为什么这么搞小动作?

我看了作者的解释,说如果直接用内置的排序函数,那就是和 C 比较了,不是和 R、matlab 比较……
这么解释,那我也就无语了。

Python、Matlab 之类的语言,很多计算功能都提供了直接的函数,这些都是用 Fortran、C 实现的,性能非常出色。 他们的意义就是在于你不需要自己写 C 代码了,直接用科学计算的函数,就可以快速运算出结果了。 至于语言本身,速度确实有限,但是问题在于你真正处理大量数据的部分都用函数了,他本身的那部分都是耗时忽略不计的部分了。

明明有现成、高效的排序函数不用,非要这样去写……

Julia 的语言设计似乎还凑合吧。 F# 的设计是非常优雅的。

别的代码我看不懂,比如说 mandel,你们学科学的应该懂。我不懂,我主要做离散数学的。 但是就看他的 R 代码一堆 for 循环。 很多人质疑他的测试不公平,拿出更好的代码,作者就说你这个改进是改进了算法,不算,比较无效。有人又提出他的 R 代码故意用的 R 最不擅长的方式写的,结果作者又提出自己对计算 fib 没兴趣,不关心,无意重写……

再看他的 C 语言 fib 数,我不写 C,但是看出他是递归算的。 C 语言是标准的低级语言,一般都是迭代计算的,他非要写个递归:

int fib(int n) {
return n < 2 ? n : fib(n-1) + fib(n-2);
}

这个代码的意思就是说对 fib(n) 计算,计算 fib(n-1) 再计算 fib(n-2),然后加起来。

你自己想想看了, 假设计算 fib(100),他这个代码就算 fib(99)+fib(98),然后算 fib(99) 又计算 fib(98)+fib(97)
如果你算 fib,那么这样算,就这一层 fib98 就重复计算了。 那么多层,重复计算多少次?

C 语言不是致力于递归计算的语言,C 语言要写 fib,正确写法是
我不会 C,所以就写伪代码了:
fib 0 = 0
fib 1 = 1
for i=2 to n
fib i = fib (i-1) + fib (i-2)
返回 fib n

当然实际实现的时候因为用 array 坑爹,可以用几个变量 a、b、c 之类的进行替换。

这样的话每个 fib 只需要计算 1 次。计算 fib(n) 基本上是线性时间。 那个递归基本上是平方时间。
也就是 C 语言里用迭代的写法做 fib,计算 fib(n) 的所需计算次数大概是常数 c×n 的级别,而他那个是 c×n^2

用某种语言最不擅长的方法来写代码,当然他就快速了***

2赞

你说得有道理。不过语言之间没有绝对公平的比较,更没有绝对优劣之分。用各自最擅长的算法比较也很难服众,毕竟代码类型已经不同了,但是可以这样认为,虽然 R 有更好的算法,这只能说它在某些领域的独特优势,但是测评起码反映了它在循环方面能力的相对弱势对吧,Matlab 也是如此。有时候(例如逐步逼近求近似解时),循环是唯一的解决办法。还有调用 C 的话确实是没有什么比较意义,因为大家都可以调用,Julia 更是可以直接写 C 与 For-(不用写接口)。至于斐波那契数列 fib 的话,也是如此反映了一个方面——Julia 与 C 递归速度差不多,而 Fortran 最快。测试并不是完整反映各种 language 的特性以及使用效果的,只能作为某些方面的反映。

谢谢你的提醒,我觉得 Julia 内部用自己本身写的库可以反映它的特点,软件内置的大部分库就是用 Julia 本身写的。刚好我这段时间要用 Matlab 做几个题目,做完有空的话我会用 Scilab、Julia、C 语言重写代码,看看效果如何,当然这也只是反映某些方面特性。

F# 我不了解啦,所以没能力讨论啦,希望你能熟练掌握。

我周围有同学尝试过,评价是速度还行,似乎执行时编译是有效果的。
问题是现在的版本还远远不能作为生产用,原因是编译器对代码的优化不稳定,
解决同样问题但使用方法不同的代码执行速度会相差很多,这对写程序的人来说是一个困扰。

ps 我是 C 派的,虽然我学过 fortran,但是由于 fortran 的标准太多而且语言越来越庞大,最后我就放弃了。
另一方面 linux 下 C 的默认编译器非常优秀,标准也比较稳定,我个人是越来越喜欢 C 的灵活性了,
让我去写 java 我完全不知道该怎么写数据结构。。。

我个人感觉周围没有人用 python 做计算,北京有些老师是用 C++ 的,这边有些人用 matlab。
用 python 的有一个是给 vim 写扩展的,有一个是用来画图,我是把 python 当 shell 用的。。。。

是的,现在不可能作为生产用,毕竟可靠性不够。哈哈,同是 C 党。Python 真的有人用,你到 Python 论坛就知道了,还有很多公司、社区开发了集成了 SciPy,NumPy 包的软件。不过现实里我也没看见人用 ^_^, 都是 Matlab、C 的天下。

看了介绍和视频,感觉很不错,于是尝试着改写一下自己正在写的 c++ 代码,主要是用来科学计算的
但是一开始就卡住了,我需要从一个文本文件读入数据,每一行都有好几个 double 型的变量,请问
如何在 julia 下,将每行的 string 分割成单独的 double 型数据? :nauseated_face: :nauseated_face: