快来吧。 保持生产力。

当我被问到为什么要使用Julia时,我的立即答复是“多次派遣”。 朱莉娅以表演着称,但这只是让我每天使用它的一部分。 多重调度是一项功能,其中函数根据参数的类型调用不同的代码。 结合JIT(即时编译器),Julia将针对调用该函数的每组参数类型自动编译专用代码。
一个简单的例子
例如,考虑以下简单功能:
f(x)= x + x
对于参数的类型,我没有给Julia带来任何提示,但是只要它是支持加法的类型,Julia都会为其编译一种优化方法。 您可以使用@code_llvm宏来查看LLVM编译器代码。
朱莉娅> @code_llvm f(1)
; @ REPL [5]:1在“ f”内
定义i64 @ julia_f_12805(i64){
最佳:
; `@ int.jl:53在“ +”内
%1 = shl i64%0、1
; └
退出i64%1
}
茱莉亚> @code_llvm f(1.0)
; @ REPL [5]:1在“ f”内
定义double @ julia_f_12813(double){
最佳:
; ┌@ float.jl:395在“ +”内
%1 =加倍%0,%0
; └
重退%1
}
忽略一些细节,请注意,一种方法专用于64位整数,另一种方法专用于双精度浮点数!
那更复杂的类型呢?
在这里,我们将使用Distributions包通过牛顿方法实现幼稚的分位数查找器。 感谢repl.it的员工,您可以在下面自己运行示例! 安装分发软件包将花费一些时间。
牛顿方法是一个找到函数根的迭代过程。

对于分位数,我们试图找到给定数量q (介于0和1之间)的数量x ,使得:
cdf(dist,x)-q = 0
其中cdf是分布dist的累积分布函数。 我们还需要cdf的导数,即概率密度函数pdf 。
同样,我们没有告诉Julia函数参数的任何信息,但是当您使用Distributions.Normal(0, 1)和0.5调用myquantile时,Julia将编译专用代码以运行算法,然后返回中位数(0.5分位数)用于标准正态分布(为0)。
请注意, myquantile可与其他发行版一起使用! 实际上,只要函数参数具有mean , cdf和pdf ,它就可以工作! 如果要在R中实现此分位数算法,则需要使用dnorm/pnorm系列函数为每个分布重写它。
带走
您使用的语言对您解决问题的方式有巨大的影响(请参阅语言相对论)。 我有统计学背景,因此R自然是我学习的最早的语言之一。 我并不是要猛击R(语言之战很无聊),因为它是一种出色的数据分析工具,但是我经常发现自己在问: “在没有for循环的情况下如何解决这个问题?”,因为R的循环很慢。朱莉娅,我的性能障碍较少,所以我的问题更多地是“我试图用什么方法来完成此任务?” 。 如果我可以将一项任务简化为需要执行的操作,那么编写适用于我抛出的任何类型的抽象而高效的代码就变得很容易。