对比来了!Julia 能打败 Python 和 R 成最终赢家吗?
在这篇文章中,作者通过一个简单的似然函数优化(Maximum Likelihood Optimization)问题来对比 Julia,R 和 Python。这是一个比较小的优化问题,性能上的差异表现可能不太明显,但解决问题的过程能很好地反应三者各自的优劣势。
作者在撰写本文时,对这三种语言的熟悉程度如下:
Julia 布道者 ChrisRackauckas 曾经说过:
如果你用 Julia 处理一个 10 秒内的问题,它的优势并不能体现出来。 而一旦处理的问题变复杂,需要花费比较长的时间,这时 Julia 的优势就会慢慢体现了。
有人用 Python 和 Julia 做过对比实验。以 10⁵ 为界点进行计算,当数值比 10⁵ 更小时 Python 比 Julia 快的。但数值大于 10⁵ 后,Julia 的速度就比 Python 快很多了。
优化问题
观察序列 Q1,Q2,...,Qn,我们需要找到优化该似然函数的参数 μ 和 σ:
通常我们会尝试优化对数似然:
在统计学上,这是截断的正态分布的最大似然估计(MLE)。
Julia 的测试情况
以下是作者使用 Julia 进行测试的情况。使用 Julia 中的 Optim.jl,可以直接使用特殊符号(symbols)作为变量名称,按照使用习惯,此处作者使用了希腊字母 μσ。Julia 还有一个 JuMP.jl 包用于优化问题。但 JuMP.jl 更适合用于更高级的优化问题,用在此处有点小题大做。
Julia 第一次优化
Julia 在执行第一次优化用了 7 秒,比 R 和 Python 都慢。对此,ChrisRackauckas 指出:
如果你需要解决 100 个 10 秒的优化问题,第一次执行需要花费 17 秒,接下来的优化不需要编译,大约只需要 10 秒。因此,总运行时长为 1007 秒。所以,当用 Julia 处理一个 10⁵ 秒的问题时,这 7 秒基本可以忽略不记;但如果用 Julia 处理 5 秒甚至更小的问题时,这 7 秒的差异就特别明显。
作者在下方硬编码了在 MLE 估计中使用的 Q_t 的值:
输出效果如下,排版看起来很舒服,也支持数学公示显示:
由此看出 Julia 的优势:
Julia 的不足:
R 的测试情况
R 有一个 truncnorm 用于处理截断正态
结果将输出:
R 的优势:
R 的不足:
Python 的测试情况
作者利用已有的 Python 学习经验想出如下方案,输入代码:
输出结果:
Python 的优势:
Python 的不足:
综上所述,三种语言的综合对比如下:
原文发布时间为:2018-09-4本文来自云栖社区合作伙伴“ CDA数据分析师”,了解相关信息可以关注“ CDA数据分析师”。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
8.JUC线程高级-Condition和线程顺序执行
有的时候我们希望线程按照希望的顺序依次执行,比如线程A,B,C,按照顺序依次执行,这时候就要用到阻塞和唤醒,之前的时候我们学到过wait()和nofity/notifyAll()这两个方法,这里我们使用java.concurrent.locks.Lock接口来实现类似的功能; 用到的包和类 java.concurrent.locks.Lock:接口 |-->java.concurrent.locks.ReentrantLock:实现类 |-->java.util.concurrent.locks.Condition:抽象类 方法: Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); 要求 创建一个TestAlternate类,有三个方法loopA(),loopB(),loopC(),分别打印A,B,C 主函数中创建三个线程,绑定三个匿名类实现Runnable接口 主函数中循环10次,使得每次打印都按照A–>B–>C的顺序来打印 创建类 TestAlternate....
- 下一篇
给妹子讲python-S01E18初探函数作用域
当你在一个程序中使用变量名时,python创建、改变或查找变量名都是在所谓的命名空间中进行的,也就是我们要说的变量的作用域。在代码中给一个变量赋值的地方决定了这个变量将存在于哪一个命名空间,也就是他的可见范围。 def之中的变量名和def之外的变量名并不冲突,一个在def之外被赋值(例如,在另外一个def之中或者在模块文件的顶层)的变量X与在这个def之中赋值的变量X是完全不同的变量。 所以我们看出,变量的作用域完全是由变量在程序文件中源代码的位置而决定,而不是由函数调用决定。 【妹子说】好啦,说了这么多概念,还是用例子说话吧! x = 99 def func () : x = 88 print(x) func() print(x) 88 99 这里就可以看出,在这个模块文件中:语句X=99,我们创建了一个名为X的全局变量(在这个函数所在的模块文件中可见
相关文章
文章评论
共有0条评论来说两句吧...