julia为什么快
在本文中,我将说明为什么认真对待创建机器学习算法和高性能数据科学编程的人们应该使用Julia而不是Python。
作为记录,我喜欢Python-我喜欢它给我的脚本和应用程序编程之间的自由。 由于我已经编写了高性能数据处理和分析代码,这些代码一直存在于HPC集群上超过25年,因此与许多使用Python解决问题的用户/程序员相比,我的看法有所不同。
尤其对于大数据,无论是在生物技术,金融科技,地球科学还是其他领域,数据处理和分析代码都可以运行数天或数周。 以2倍,3倍或5倍的速度减慢来换取程序员的生产力或抽象度是不可接受的折衷方案。
也许Python,Matlab,R等语言可以使研究人员制定解决方案的新方法,对研究很有用,但除非它们相差不大两倍,否则它们就无法在大数据/ HPC世界中竞争。与优化的Fortran相比,在运行时
我自己,对于一般的HPC应用程序,我将HPF(高性能fortan)和C / C ++与GPGPU混合使用。 对于需要交付给客户的商业应用程序,我使用Java(Netbeans)/ C和GPGPU的混合物。 目前,对于我的前端应用程序面向用户的开发,我使用Java Netbeans,但现在越来越多地使用Python和Node.js,这是因为它们既简单又可移植。
话虽如此,直到我遇到Julia,我对结果不满意。
Julia(Julia)的发布帖子承诺:“该语言将C的速度与Python的可用性,Ruby的动态性,Matlab的数学能力以及R的统计能力结合在一起。”
Julia的核心创建者和促进者之一,爱德曼说,从技术角度来看,该语言的核心特征是“其多调度范式,它可以表达面向对象和功能的编程模式,支持“通用编程”,并且它的“攻击性类型系统”。这种类型系统可以满足许多不同的用例;它是动态类型化的,但支持可选的类型声明。语言“感觉像脚本语言”,但可以编译为“高效的本机代码”通过LLVM支持多个平台。”
“ Julia已发布的基准测试表明它的性能接近或稍差于C,而Fortran照例在大多数任务上的性能均优于C。”
Julia的语法非常类似于Matlab,但是具有Python的灵活性,并提供类似Lisp的宏,从而使程序员更容易入门。 对我而言,与Matlab / Python的区别真正体现在使用Julia惊人的快速基于LLVM的即时(JIT)编译器时,它易于实现分布式并行执行,并关心数值准确性。
Julia还具有一个数学函数库,其中大多数是用Julia编写的,以及C和Fortran库。 从任何角度看,这都不能算是一件坏事。 那里的大多数主要的机器学习工具集(例如TensorFlow)都是用C语言编写的。 从性能的角度来看,这是一件好事,但有时也会出现缺点,如下所示。
对于程序员而言,Julia功能强大,因为它围绕类型构建。 我们可以轻松地构建通用代码,该通用代码在各种类型上都具有良好的性能。 结果是接近高性能Fortran代码的东西,但是它也具有许多功能。
Edelman说:“ Matlab和其他环境采用以前编写的Fortran或C或专有代码,然后将它们与所谓的泡泡糖和回形针粘合在一起。这具有易于访问用更困难的语言编写的程序的优势,但是成本。当您准备自己编写代码时,您将不会从Fortran或C速度中受益。”
Julia(Julia)对我而言最大的优势在于旧版图书馆问题。 甚至可以从REPL中直接调用Fortran和C例程(编译为共享库),并且没有胶水代码也没有仪式。
这是使用Fortran NAG库而没有大惊小怪的示例:
function nag_nearest_correlation(g:: Matrix { Float64 }, order = Nag_ColMajor, errtol= 0.0 , maxits=NagInt( 0 ), maxit=NagInt( 0 ))
n, pdg = size(g)
pdx = pdg
x = Array ( Float64 ,n,pdg)
nag_nearest_correlation!(order, g, pdg, n, errtol, maxits, maxit, x, pdx)
return x
end
G = [ 2.0 - 1.0 0.0 0.0 ;
- 1.0 2.0 - 1.0 0.0 ;
0.0 - 1.0 2.0 - 1.0 ;
0.0 0.0 - 1.0 2.0 ]
X = nag_nearest_correlation(G)
这意味着我可以快速建立在多年的开发基础上,而不必花费数周或数月的复杂前端包装程序构建,这本身必须经过测试和调试,而我导入的代码已经过测试并可以使用。
爱德曼(Edelman)用来推广这个想法的案例:
不幸的是,当咳嗽的口音不同时,机器学习模型预测个人是否患有结核病的能力受到了阻碍。
Edelman说:“当然,您要做的就是了解某人是否生病,而您不希望它了解口音的差异。”
使用像Python这样的高级语言和标准的机器学习库来解决由不同的重音引起的混淆是很困难的,这些语言通常是用性能更好的低级语言(如C ++)编写的。
“有人告诉我,所有常规库都做不到。这不是很困难,但是您必须以标准库不允许您做的方式来调整神经网络。”他说。
“当前的库有点像砖砌的建筑物,如果要四处移动它们,必须要有一个相当繁重的程序员才能对其进行更改。
“但是这位同伙对朱莉亚说,因为它的水平很高,所以他能够轻松解决这个问题。
“因此,我们真正想做的是使越来越多的人能够做这种事情,从而能够超越现有图书馆的范围,并借助机器学习进行创新。”
Julia(Julia)可以随意导入这些“砖块建筑物”的功能赋予了它强大的功能,但是它能够有效地取代它们,因此对于像我这样的人而不是说Python的人来说,这是一个明确的选择。
这是TensorFlow的一部分神经元激活功能的片段示例,整个文件softsign_op.cc
及其关联的标头在某种意义上是普通Python开发人员无法访问的。 在Julia中,我们可以像这样编写高性能的代码,但更易于理解和修改。
template < typename Device, typename T>
class SoftsignGradOp
: public BinaryElementWiseOp<T, SoftsignGradOp<Device, T>> {
public :
explicit SoftsignGradOp (OpKernelConstruction* context)
: BinaryElementWiseOp<T, SoftsignGradOp<Device, T>> (context) {}
void OperateNoTemplate (OpKernelContext* context, const Tensor& g,
const Tensor& a, Tensor* output) ;
// INPUTS:
// g (gradients): backpropagated gradients
// a (inputs): inputs that were passed to SoftsignOp()
// OUTPUT:
// gradients to backprop
template < int NDIMS>
void Operate (OpKernelContext* context, const Tensor& g, const Tensor& a,
Tensor* output) {
OperateNoTemplate(context, g, a, output);
}
};
template < typename Device, typename T>
void SoftsignGradOp<Device, T>::OperateNoTemplate(OpKernelContext* context,
const Tensor& g,
const Tensor& a,
Tensor* output) {
OP_REQUIRES(context, a.IsSameSize(g),
errors::InvalidArgument( "g and a must be the same size" ));
functor::SoftsignGrad<Device, T> functor;
functor(context->eigen_device<Device>(), g.flat<T>(), a.flat<T>(),
output->flat<T>());
}
回想起我几乎和Julia一样爱Python:
软件包管理器可加速Julia的开发,从而简化附加组件的开发。 IJulia
是与IPython
社区一起开发的,旨在与基于Jupyter
基于浏览器的图形笔记本界面链接在一起,我们的社区利用该界面演示易于重复的研究成果。
Edelman对Julia的内置功能充满了诗意,该功能使开发人员可以更轻松地在同一处理器中和分布式系统中的多个芯片之间的多个CPU内核之间分配工作负载。 当前的发展重点是Julia对其他类型的处理器上的并行处理的本机支持,例如图形处理单元(GPU)和Google的Tensor处理单元(TPU),它们越来越多地用于加速机器学习。
Julia是一种功能强大的语言,但是与Python相比,它还相对年轻,但是也许您想使用Julia外部的自己的库。 在这种情况下,Julia提供了从R和Python调用库的方法(甚至通过JNI
扩展了Java,甚至比Jython
和它的朋友还成熟)
julia>using JavaCall
julia> JavaCall.init([ "-Xmx128M" ])
julia> jlm = @jimport java.lang.Math
JavaObject{:java.lang.Math} (constructor with 2 methods))
julia> jcall(jlm, "sin" , jdouble, (jdouble,), pi / 2 )
1.0
这是使用Pandas
机器学习工具包的示例(直接从Julia中的Python获取)
julia> Pkg.add("PyCall.jl" )
using PyCall
@pyimport pandas as pd
df = pd.read_csv( "train.csv" )
或更直接地使用https://github.com/JuliaPy/Pandas.jl
在下一个示例中,我们直接从Julia调用Python的matplotlib
,几乎没有开销(没有传递副本就传递了数组)。
using Pkg
Pkg.add( "PyPlot" )
using PyPlot
x = range( 0 ,stop= 2 * pi ,length= 1000 ); y = sin.( 3 *x + 4 *cos.( 2 *x))
plot(x, y, color= "red" , linewidth= 2.0 , linestyle= "--" )
这就是我真正喜欢Julia的东西。 在过去的30年中,我已经积累了很多专业代码和库。 在大多数情况下,没有什么要移植或重写的内容,也没有繁琐的任务。
我想明确一点,我并不是说“ Python是给孩子们的”之类的意思,而是要进行认真的研究,再结合在大数据世界中快速开发和部署,Julia具有明显的优势,我认为远远超过了Python的缺点。
随着语言的支持(它是目前发展最快的语言之一),许多缺少的东西将被添加。 我认为Python无法成长为Julia,因此
我爱上了Julia。
先前发布在https://www.linkedin.com/pulse/why-im-love-julia-david-markus/
翻译自: https://hackernoon.com/why-im-in-love-with-julia-jo763y3a
julia为什么快