Julia是一种用于数值计算的免费开源,高级,高性能,动态编程语言。 它具有动态语言的开发便利性和已编译的静态类型语言的性能,这部分要归功于基于LLVM的JIT编译器可以生成本机机器代码,部分要归功于通过多专业化实现类型稳定性的设计dispatch ,可以轻松地将其编译为有效的代码。
在2012年宣布Julia首次发布的博客文章中,该语言的作者Jeff Bezanson , Stefan Karpinski , Viral Shah和Alan Edelman表示,他们花了三年时间创建了Julia,因为他们很贪婪 。 他们厌倦了Matlab,Lisp,Python,Ruby,Perl,Mathematica,R和C之间的权衡,并希望使用一种适用于科学计算,机器学习,数据挖掘,大规模线性代数的语言。 ,并行计算和分布式计算。
朱莉娅是谁的? 除了对研究科学家和工程师具有吸引力之外,Julia对数据科学家,金融分析师和量化指标也具有吸引力。
该语言的设计者和另外两名语言设计师于2015年7月成立了Julia Computing ,以“开发使Julia易于使用,易于部署和易于扩展的产品。” 截至撰写本文时,该公司拥有28名员工,客户包括国家实验室,银行,经济学家和自动驾驶汽车研究人员。 除了在GitHub上维护Julia开源存储库外 ,Julia Computing还提供商业产品,包括JuliaPro (免费和付费版本)。
为什么是朱莉娅?
朱莉娅“旨在用单一语言创建前所未有的易用性,功能和效率的组合。” 关于效率问题,请考虑下图:
朱莉娅基准
我们在这里看到的是,对于某些类型的操作,Julia代码可以比C快,而对于其他一些操作,它的速度却不超过C几倍。 相比之下,R在某些操作中可能比C慢1000倍。
请注意,Julia最慢的测试之一是斐波那契递归。 这是因为Julia目前缺乏尾递归优化。 递归本质上比循环慢。 对于要在生产环境中运行的真正Julia程序,您将需要实现此类算法的循环(迭代)形式。
朱莉娅JIT编译
与纯解释器相反,JIT(即时)编译器方法要付出代价:编译器必须先解析源代码并生成机器代码,然后代码才能运行。 这可能意味着Julia函数在每个函数和宏第一次在会话中运行时就具有明显的启动时间。 因此,在下面的屏幕截图中,我们看到第二次生成一百万个随机浮点数,所花费的时间比第一次执行时少一个数量级。 @time
宏和rand()
函数都需要通过代码进行第一次编译,因为Julia库是用Julia编写的。
julia> @time rand(10^6);
0.62081 seconds (14.44 k allocations: 8.415 MiB)
julia> @time rand(10^6);
0.004881 seconds (7 allocations: 7.630 MiB)
茱莉亚(Julia)粉丝各种各样地声称,它易于使用Python,R甚至Matlab。 这些比较确实值得仔细研究,因为Julia语言优雅,强大并且面向科学计算,并且库提供了广泛的高级编程功能。
朱莉娅的例子
作为快速的Julia语言示例,请考虑以下Mandelbrot集基准代码 :
如您所见,语言中内置了复数算法,测试和计时宏也是如此。 您还可以看到,茱莉亚缺少困扰C语言的尾随分号和困扰Lisp语言的嵌套括号。 请注意,在第61和62行中,两次调用了mandelperf()
。第一个调用测试结果的正确性并进行JIT编译; 第二个电话获取时间。
朱莉娅编程
朱莉娅还有许多其他功能值得一提。 首先,用户定义的类型与内置的类型一样快速且紧凑。 实际上,您可以声明行为类似于泛型类型的抽象类型,只是它们针对传递的参数类型进行编译。
再者,Julia的内置代码矢量化意味着无需程序员对性能进行矢量化。 普通的去矢量化代码速度很快。 如果底层CPU上有SIMD指令和寄存器,则编译器可以利用它们,并在顺序过程中展开循环以在硬件允许的范围内对其进行向量化。 您可以使用@simd
批注将循环标记为可矢量化。
朱莉娅平行性
Julia还使用两个原语设计用于并行性和分布式计算:远程引用和远程调用。 远程引用有两种形式: Future
和RemoteChannel
。 Future
相当于JavaScript的promise
; RemoteChannel
是可重写的,可用于进程间通信,例如Unix pipe
或Go channel
。 假设您已经用多个进程启动了Julia(例如,针对八核CPU(例如Intel Core i7)的julia -p 8
),则可以@spawn
或@spawn
remotecall()
函数调用在另一个Julia进程上异步执行,然后再fetch()
要同步并使用结果时返回的Future
。
如果不需要在多个内核上运行,则可以利用轻量级的“绿色”线程,在Julia中称为Task()
,在某些其他语言中称为协程 。 Task()
或@task
与Channel
结合使用,该Channel
是RemoteChannel
的单进程版本。
朱莉娅类型系统
Julia具有一个引人注目的功能强大的类型系统,该系统默认情况下具有运行时类型推断的动态功能,但允许可选的类型注释。 这类似于TypeScript。 例如:
julia> (1+2)::AbstractFloat
ERROR: TypeError: typeassert: expected AbstractFloat, got Int64
julia> (1+2)::Int
3
在这里,我们第一次断言一个不兼容的类型,从而导致一个错误,而第二次断言一个兼容的类型。
朱莉娅弦
Julia具有对以UTF-8格式存储的Unicode字符串和字符的有效支持,以及对ASCII字符的有效支持,因为在UTF-8中,小于0x80(128)的代码点被编码为单个字符。 否则,UTF-8是可变长度编码,因此您不能假定Julia字符串的长度等于最后一个字符索引。
全面支持UTF-8意味着,除其他外,您可以轻松地使用希腊字母定义变量,这可以使科学的Julia代码看起来非常像公式的教科书解释,例如sin(2π)
。 提供了transcode()
函数来将UTF-8与其他Unicode编码进行相互转换。
C和Fortran函数
尽管您确实需要了解Fortran编译器发出的“修饰”函数名称,但是Julia可以直接调用C和Fortran函数,而无需包装或特殊API。 外部C或Fortran函数必须位于共享库中。 您可以使用Julia ccall()
函数进行实际的ccall()
。 例如,在类似Unix的系统上,可以使用以下Julia代码通过libc中的getenv
函数获取环境变量的值:
function getenv(var::AbstractString)
val = ccall((:getenv, "libc"),
Cstring, (Cstring,), var)
if val == C_NULL
error("getenv: undefined variable: ", var)
end
unsafe_string(val)
end
julia> getenv("SHELL")
"/bin/bash"
朱莉娅宏
Julia具有类似于Lisp的宏,与C和C ++使用的宏预处理器不同。 Julia还具有其他元编程功能,例如反射,代码生成,符号(例如:foo
)和表达式(例如:(a+b*c+1)
)对象, eval()
和生成的函数。 Julia宏在解析时进行评估。
另一方面,当已知函数的参数类型时,将在函数编译之前对其进行扩展。 通过消除对运行时分派以支持参数多态性的需求,生成的函数具有通用函数(在C ++和Java中实现)的灵活性以及强类型函数的效率。
GPU支持
茱莉亚(Julia)使用MXNet深度学习软件包, ArrayFire GPU阵列库 ,cuBLAS和cuDNN线性代数以及深度神经网络库以及用于通用GPU计算的CUDA框架提供GPU支持。 下图显示了Julia包装器及其各自的库。
JuliaPro和Juno IDE
您可以从Julia语言站点下载适用于Windows,MacOS,通用Linux或通用FreeBSD的免费开源Julia命令行。 您可以从GitHub克隆Julia源代码存储库。
或者,您可以从Julia Computing 下载JuliaPro 。 除了编译器之外,JuliaPro还为您提供了基于Atom的Juno IDE(如下所示)和160多种精选软件包,包括可视化和绘图。
除了免费的JuliaPro之外,您还可以添加企业支持,定量财务功能,数据库支持和时间序列分析的订阅。 JuliaRun是用于集群或云的可伸缩服务器。
Jupyter笔记本和IJulia
除了将Juno用作Julia IDE外,您还可以将Visual Studio Code与Julia扩展一起使用(直接显示在下面),以及将Jupyter笔记本与IJulia内核一起使用(显示在下面的第二张和第三张屏幕截图中)。 您可能需要为Python 2或(最好)与Anaconda或pip的Python 3安装Jupyter笔记本。
朱莉娅·博克斯(JuliaBox)
您可以使用Julia Computing的另一种产品JuliaBox (如下所示)在Jupyter笔记本中在线运行Julia,而无需在本地计算机上进行任何安装。 JuliaBox当前包含300多个软件包,运行Julia 0.6.2,并包含数十个Jupyter教程笔记本。 教程文件夹的顶级列表如下所示。 JuliaBox访问的免费级别使您可以使用三个CPU内核进行90分钟的会话; 每月14美元的个人订阅可为您提供五个核心的四个小时的课程; 每月70美元的专业版订阅可为您提供32个核心的八小时会话。 截至2018年6月,尚未提供GPU访问权限。
朱莉娅套餐
朱莉娅“走路像Python,但跑起来像C。” 正如我的同事Serdar Yegulalp 在2017年12月所写的那样 ,Julia开始向Python挑战数据科学编程,这两种语言都有优势。 为了说明Julia对数据科学的支持日趋成熟,请考虑已经有两本书《 朱莉娅·数据科学》 ,一本由Zacharias Voulgaris 撰写 ,另一本由Anshul Joshi撰写 ,尽管我不能说两本的质量一。
如果查看下面显示的来自Julia Observer的总体上评分最高的Julia软件包 ,您将看到Jupyter笔记本的Julia内核,Gadfly图形软件包(类似于R中的ggplot2
),通用绘图界面,若干深度学习和机器学习包,微分方程求解器,DataFrames,纽约联储动态随机一般均衡(DSGE)模型,优化建模语言以及与Python和C ++的接口。 如果您在此常规列表中走得更远,还可以找到QuantEcon,PyPlot,ScikitLearn,生物信息学软件包以及用于函数式编程的惰性列表的实现。
如果Julia软件包不能满足您的需求,并且Python接口不能满足您的需求,那么您还可以安装一个软件包,为您提供R(RCall)和Matlab的通用接口。
朱莉娅(Julia)用于金融分析师和量化
Quants和财务分析师将找到许多免费软件包,以加快工作速度,如下面的屏幕快照所示。 此外,Julia Computing还提供了JuliaFin套件,其中包括Miletus (用于金融合同的DSL), JuliaDB (高性能的内存和分布式数据库), JuliaInXL (从Excel工作表中调用Julia)和Bloomberg连接(访问真实时间和历史市场数据)。
From: https://www.infoworld.com/article/3284380/what-is-julia-a-fresh-approach-to-numerical-computing.html